Merge 10.2 into 10.3
This commit is contained in:
commit
acf6f92aa9
@ -1,5 +1,5 @@
|
|||||||
# Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
|
# 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
|
# 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
|
# 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) {
|
if (err != DB_SUCCESS) {
|
||||||
msg("mariabackup: innodb_init() returned %d (%s).",
|
die("mariabackup: innodb_init() returned %d (%s).",
|
||||||
err, ut_strerr(err));
|
err, ut_strerr(err));
|
||||||
innodb_shutdown();
|
|
||||||
return(TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return(FALSE);
|
return(FALSE);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
'\" t
|
'\" 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
|
.\" * set default formatting
|
||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
@ -198,6 +198,21 @@ Must be given as first option\&.
|
|||||||
.sp -1
|
.sp -1
|
||||||
.IP \(bu 2.3
|
.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
|
.\" mysql_install_db: force option
|
||||||
.\" force option: mysql_install_db
|
.\" force option: mysql_install_db
|
||||||
\fB\-\-force\fR
|
\fB\-\-force\fR
|
||||||
@ -354,7 +369,7 @@ For internal use\&. This option is used for creating Windows distributions\&.
|
|||||||
.SH "COPYRIGHT"
|
.SH "COPYRIGHT"
|
||||||
.br
|
.br
|
||||||
.PP
|
.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
|
.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.
|
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
|
.PP
|
||||||
|
@ -504,6 +504,10 @@ GEOMETRYFROMTEXT('POINT(4599 60359)'),
|
|||||||
) as relate_res;
|
) as relate_res;
|
||||||
relate_res
|
relate_res
|
||||||
0
|
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';
|
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
|
||||||
1
|
1
|
||||||
|
@ -382,6 +382,12 @@ SELECT ST_RELATE(
|
|||||||
'F*FFFF**F'
|
'F*FFFF**F'
|
||||||
) as relate_res;
|
) 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.
|
# 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';
|
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
|
12:12:13 1
|
||||||
DROP TABLE t1;
|
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
|
# 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;
|
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 #
|
||||||
--echo # End of 10.1 tests
|
--echo # End of 10.1 tests
|
||||||
--echo #
|
--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`
|
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;
|
set optimizer_switch= @save_optimizer_switch;
|
||||||
DROP TABLE books, wings;
|
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;
|
set optimizer_switch= @save_optimizer_switch;
|
||||||
|
|
||||||
DROP TABLE books, wings;
|
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
|
2012-03-01 02:00:00 3 1
|
||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
# End of 5.5 test
|
# 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
|
# Bug#12663165 SP DEAD CODE REMOVAL DOESN'T UNDERSTAND CONTINUE HANDLERS
|
||||||
#
|
#
|
||||||
|
@ -9068,6 +9068,15 @@ DROP PROCEDURE p1;
|
|||||||
|
|
||||||
--echo # End of 5.5 test
|
--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 #
|
||||||
--echo # Bug#12663165 SP DEAD CODE REMOVAL DOESN'T UNDERSTAND CONTINUE HANDLERS
|
--echo # Bug#12663165 SP DEAD CODE REMOVAL DOESN'T UNDERSTAND CONTINUE HANDLERS
|
||||||
|
@ -625,6 +625,76 @@ MAX(pk)
|
|||||||
NULL
|
NULL
|
||||||
DROP TABLE t1;
|
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
|
# MDEV-18899: Server crashes in Field::set_warning_truncated_wrong_value
|
||||||
#
|
#
|
||||||
set names utf8;
|
set names utf8;
|
||||||
|
@ -401,6 +401,61 @@ SELECT MAX(pk) FROM t1;
|
|||||||
|
|
||||||
DROP TABLE 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 #
|
||||||
--echo # MDEV-18899: Server crashes in Field::set_warning_truncated_wrong_value
|
--echo # MDEV-18899: Server crashes in Field::set_warning_truncated_wrong_value
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -652,6 +652,76 @@ MAX(pk)
|
|||||||
NULL
|
NULL
|
||||||
DROP TABLE t1;
|
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
|
# MDEV-18899: Server crashes in Field::set_warning_truncated_wrong_value
|
||||||
#
|
#
|
||||||
set names utf8;
|
set names utf8;
|
||||||
|
@ -65,3 +65,27 @@ SELECT * FROM t1;
|
|||||||
a_id b_id c_id
|
a_id b_id c_id
|
||||||
1 NULL NULL
|
1 NULL NULL
|
||||||
drop table t1,t2;
|
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);
|
UPDATE t1 SET b_id = (SELECT t2.b_id FROM t2 t2 WHERE t2.c_id = t1.c_id);
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
drop table t1,t2;
|
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
|
2 2 2 4
|
||||||
drop table t1;
|
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
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -2255,6 +2255,16 @@ select e.id,
|
|||||||
from t1 e;
|
from t1 e;
|
||||||
drop table t1;
|
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 #
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
--echo #
|
--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")
|
ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||||
SHOW WARNINGS;
|
SHOW WARNINGS;
|
||||||
Level Code Message
|
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")
|
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`
|
Warning 1215 Cannot add foreign key constraint for `t1`
|
||||||
DROP TABLE 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
|
# Start of 10.2 tests
|
||||||
#
|
#
|
||||||
# MDEV-13246 Stale rows despite ON DELETE CASCADE constraint
|
# 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;
|
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
||||||
--error ER_CANT_CREATE_TABLE
|
--error ER_CANT_CREATE_TABLE
|
||||||
ALTER IGNORE TABLE t1 ADD FOREIGN KEY (a) REFERENCES t2 (b);
|
ALTER IGNORE TABLE t1 ADD FOREIGN KEY (a) REFERENCES t2 (b);
|
||||||
--replace_regex /#sql-[0-9_a-f-]*/#sql-temporary/
|
|
||||||
SHOW WARNINGS;
|
SHOW WARNINGS;
|
||||||
DROP TABLE t1;
|
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 # Start of 10.2 tests
|
||||||
|
|
||||||
--echo #
|
--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_n_points)
|
||||||
{
|
{
|
||||||
|
if (m_hook)
|
||||||
|
*m_hook= NULL;
|
||||||
free_list(m_first);
|
free_list(m_first);
|
||||||
m_n_points= 0;
|
m_n_points= 0;
|
||||||
}
|
}
|
||||||
|
@ -2048,6 +2048,7 @@ int ha_recover(HASH *commit_list)
|
|||||||
for (info.len= MAX_XID_LIST_SIZE ;
|
for (info.len= MAX_XID_LIST_SIZE ;
|
||||||
info.list==0 && info.len > MIN_XID_LIST_SIZE; info.len/=2)
|
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));
|
info.list=(XID *)my_malloc(info.len*sizeof(XID), MYF(0));
|
||||||
}
|
}
|
||||||
if (!info.list)
|
if (!info.list)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
/* 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
|
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
|
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_EXPLAIN:
|
||||||
case SQLCOM_SHOW_FIELDS:
|
case SQLCOM_SHOW_FIELDS:
|
||||||
case SQLCOM_SHOW_FUNC_CODE:
|
case SQLCOM_SHOW_FUNC_CODE:
|
||||||
|
case SQLCOM_SHOW_GENERIC:
|
||||||
case SQLCOM_SHOW_GRANTS:
|
case SQLCOM_SHOW_GRANTS:
|
||||||
case SQLCOM_SHOW_ENGINE_STATUS:
|
case SQLCOM_SHOW_ENGINE_STATUS:
|
||||||
case SQLCOM_SHOW_ENGINE_LOGS:
|
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";
|
const char *format= "Instruction at position %u has m_ip=%u";
|
||||||
char tmp[sizeof(format) + 2*SP_INSTR_UINT_MAXLEN + 1];
|
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
|
Since this is for debugging purposes only, we don't bother to
|
||||||
introduce a special error code for it.
|
introduce a special error code for it.
|
||||||
|
@ -2443,6 +2443,9 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool create_tmp_table_for_derived;
|
bool create_tmp_table_for_derived;
|
||||||
|
|
||||||
|
/* The flag to force reading statistics from EITS tables */
|
||||||
|
bool force_read_stats;
|
||||||
|
|
||||||
bool save_prep_leaf_list;
|
bool save_prep_leaf_list;
|
||||||
|
|
||||||
/* container for handler's private per-connection data */
|
/* 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());
|
my_error(ER_SP_BADSELECT, MYF(0), ErrConvDQName(sp).ptr());
|
||||||
return 1;
|
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;
|
ha_rows select_limit= thd->variables.select_limit;
|
||||||
thd->variables.select_limit= HA_POS_ERROR;
|
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))
|
if (setup_sum_funcs(thd, sum_funcs))
|
||||||
goto err;
|
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"));
|
DBUG_PRINT("info",("Sorting for order"));
|
||||||
THD_STAGE_INFO(thd, stage_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) 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
|
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
|
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);
|
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);
|
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");
|
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)
|
if (thd->bootstrap || thd->variables.use_stat_tables == NEVER)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
if (thd->force_read_stats)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
switch(thd->lex->sql_command) {
|
switch(thd->lex->sql_command) {
|
||||||
case SQLCOM_SELECT:
|
case SQLCOM_SELECT:
|
||||||
case SQLCOM_INSERT:
|
case SQLCOM_INSERT:
|
||||||
@ -4081,6 +4084,7 @@ bool is_eits_usable(Field *field)
|
|||||||
partition list of a table. We assume the selecticivity for
|
partition list of a table. We assume the selecticivity for
|
||||||
such columns would be handled during partition pruning.
|
such columns would be handled during partition pruning.
|
||||||
*/
|
*/
|
||||||
|
DBUG_ASSERT(field->table->stats_is_read);
|
||||||
Column_statistics* col_stats= field->read_stats;
|
Column_statistics* col_stats= field->read_stats;
|
||||||
return col_stats && !col_stats->no_stat_values_provided() && //(1)
|
return col_stats && !col_stats->no_stat_values_provided() && //(1)
|
||||||
field->type() != MYSQL_TYPE_GEOMETRY && //(2)
|
field->type() != MYSQL_TYPE_GEOMETRY && //(2)
|
||||||
|
@ -738,11 +738,6 @@ public:
|
|||||||
{
|
{
|
||||||
length(0);
|
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))
|
if (lock_tables(thd, table_list, table_count, 0))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
|
||||||
|
(void) read_statistics_for_tables_if_needed(thd, table_list);
|
||||||
|
|
||||||
THD_STAGE_INFO(thd, stage_init_update);
|
THD_STAGE_INFO(thd, stage_init_update);
|
||||||
if (table_list->handle_derived(thd->lex, DT_MERGE_FOR_INSERT))
|
if (table_list->handle_derived(thd->lex, DT_MERGE_FOR_INSERT))
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
@ -1688,6 +1690,7 @@ int mysql_multi_update_prepare(THD *thd)
|
|||||||
{
|
{
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
|
(void) read_statistics_for_tables_if_needed(thd, table_list);
|
||||||
/* @todo: downgrade the metadata locks here. */
|
/* @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)
|
for ( ; elem1 && elem2; elem1= elem1->next, elem2= elem2->next)
|
||||||
{
|
{
|
||||||
int cmp;
|
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)))
|
if ((cmp= compare_order_elements(elem1, elem2)))
|
||||||
return cmp;
|
return cmp;
|
||||||
}
|
}
|
||||||
|
@ -1671,7 +1671,6 @@ void ha_archive::update_create_info(HA_CREATE_INFO *create_info)
|
|||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Hints for optimizer, see ha_tina for more information
|
Hints for optimizer, see ha_tina for more information
|
||||||
*/
|
*/
|
||||||
@ -1679,22 +1678,7 @@ int ha_archive::info(uint flag)
|
|||||||
{
|
{
|
||||||
DBUG_ENTER("ha_archive::info");
|
DBUG_ENTER("ha_archive::info");
|
||||||
|
|
||||||
mysql_mutex_lock(&share->mutex);
|
flush_and_clear_pending_writes();
|
||||||
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);
|
|
||||||
|
|
||||||
stats.deleted= 0;
|
stats.deleted= 0;
|
||||||
|
|
||||||
DBUG_PRINT("ha_archive", ("Stats rows is %d\n", (int)stats.records));
|
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
|
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
|
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);
|
int unpack_row(azio_stream *file_to_read, uchar *record);
|
||||||
unsigned int pack_row(uchar *record, azio_stream *writer);
|
unsigned int pack_row(uchar *record, azio_stream *writer);
|
||||||
bool check_if_incompatible_data(HA_CREATE_INFO *info, uint table_changes);
|
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);
|
return(bpage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4682,15 +4678,9 @@ evict_from_pool:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!recv_no_ibuf_operations) {
|
if (!access_time && !recv_no_ibuf_operations) {
|
||||||
if (access_time) {
|
ibuf_merge_or_delete_for_page(
|
||||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
block, page_id, &page_size, TRUE);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buf_pool_mutex_enter(buf_pool);
|
buf_pool_mutex_enter(buf_pool);
|
||||||
@ -4892,10 +4882,6 @@ evict_from_pool:
|
|||||||
buf_read_ahead_linear(page_id, page_size, ibuf_inside(mtr));
|
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,
|
ut_ad(!rw_lock_own_flagged(hash_lock,
|
||||||
RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
|
RW_LOCK_FLAG_X | RW_LOCK_FLAG_S));
|
||||||
|
|
||||||
@ -5003,10 +4989,6 @@ buf_page_optimistic_get(
|
|||||||
ibuf_inside(mtr));
|
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 = buf_pool_from_block(block);
|
||||||
buf_pool->stat.n_page_gets++;
|
buf_pool->stat.n_page_gets++;
|
||||||
|
|
||||||
@ -5110,9 +5092,6 @@ buf_page_get_known_nowait(
|
|||||||
}
|
}
|
||||||
#endif /* UNIV_DEBUG */
|
#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++;
|
buf_pool->stat.n_page_gets++;
|
||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
@ -5197,10 +5176,6 @@ buf_page_try_get_func(
|
|||||||
|
|
||||||
buf_pool->stat.n_page_gets++;
|
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);
|
return(block);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5599,11 +5574,6 @@ buf_page_create(
|
|||||||
if (block
|
if (block
|
||||||
&& buf_page_in_file(&block->page)
|
&& buf_page_in_file(&block->page)
|
||||||
&& !buf_pool_watch_is_sentinel(buf_pool, &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);
|
ut_d(block->page.file_page_was_freed = FALSE);
|
||||||
|
|
||||||
/* Page can be found in buf_pool */
|
/* Page can be found in buf_pool */
|
||||||
@ -5708,9 +5678,6 @@ buf_page_create(
|
|||||||
#if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
|
#if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
|
||||||
ut_a(++buf_dbg_counter % 5771 || buf_validate());
|
ut_a(++buf_dbg_counter % 5771 || buf_validate());
|
||||||
#endif /* UNIV_DEBUG || UNIV_BUF_DEBUG */
|
#endif /* UNIV_DEBUG || UNIV_BUF_DEBUG */
|
||||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
|
||||||
ut_a(ibuf_count_get(block->page.id) == 0);
|
|
||||||
#endif
|
|
||||||
return(block);
|
return(block);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6158,14 +6125,6 @@ database_corrupted:
|
|||||||
buf_pool_mutex_enter(buf_pool);
|
buf_pool_mutex_enter(buf_pool);
|
||||||
mutex_enter(block_mutex);
|
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
|
/* 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
|
did the locking, we use a pass value != 0 in unlock, which simply
|
||||||
removes the newest lock debug record, without checking the thread
|
removes the newest lock debug record, without checking the thread
|
||||||
@ -6394,11 +6353,6 @@ buf_pool_validate_instance(
|
|||||||
buf_pool, block->page.id)
|
buf_pool, block->page.id)
|
||||||
== &block->page);
|
== &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)) {
|
switch (buf_page_get_io_fix(&block->page)) {
|
||||||
case BUF_IO_NONE:
|
case BUF_IO_NONE:
|
||||||
break;
|
break;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
Copyright (c) 2013, 2014, Fusion-io
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
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_mutex(bpage)->is_owned());
|
||||||
ut_ad(buf_page_get_io_fix(bpage) == BUF_IO_WRITE);
|
ut_ad(buf_page_get_io_fix(bpage) == BUF_IO_WRITE);
|
||||||
ut_ad(bpage->oldest_modification != 0);
|
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);
|
ut_ad(bpage->newest_modification != 0);
|
||||||
|
|
||||||
/* Force the log to the disk before writing the modified block */
|
/* 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) 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
|
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
|
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;
|
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) {
|
if (zip || !bpage->zip.data) {
|
||||||
/* This would completely free the block. */
|
/* This would completely free the block. */
|
||||||
/* Do not completely free dirty blocks. */
|
/* Do not completely free dirty blocks. */
|
||||||
|
@ -4355,11 +4355,19 @@ dict_create_foreign_constraints_low(
|
|||||||
}
|
}
|
||||||
|
|
||||||
orig = ptr;
|
orig = ptr;
|
||||||
ptr = dict_accept(cs, ptr, "TABLE", &success);
|
for (;;) {
|
||||||
|
ptr = dict_accept(cs, ptr, "TABLE", &success);
|
||||||
if (!success) {
|
if (success) {
|
||||||
|
break;
|
||||||
goto loop;
|
}
|
||||||
|
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 */
|
/* 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 */
|
/** The insert buffer control structure */
|
||||||
ibuf_t* ibuf = NULL;
|
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 */
|
/** @name Offsets to the per-page bits in the insert buffer bitmap */
|
||||||
/* @{ */
|
/* @{ */
|
||||||
#define IBUF_BITMAP_FREE 0 /*!< Bits indicating the
|
#define IBUF_BITMAP_FREE 0 /*!< Bits indicating the
|
||||||
@ -408,35 +379,6 @@ ibuf_tree_root_get(
|
|||||||
return(root);
|
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. */
|
Closes insert buffer and frees the data structures. */
|
||||||
void
|
void
|
||||||
@ -733,10 +675,6 @@ ibuf_bitmap_page_set_bits(
|
|||||||
compile_time_assert(!(IBUF_BITS_PER_PAGE % 2));
|
compile_time_assert(!(IBUF_BITS_PER_PAGE % 2));
|
||||||
ut_ad(mtr_memo_contains_page(mtr, page, MTR_MEMO_PAGE_X_FIX));
|
ut_ad(mtr_memo_contains_page(mtr, page, MTR_MEMO_PAGE_X_FIX));
|
||||||
ut_ad(mtr->is_named_space(page_id.space()));
|
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())
|
bit_offset = (page_id.page_no() % page_size.physical())
|
||||||
* IBUF_BITS_PER_PAGE + bit;
|
* IBUF_BITS_PER_PAGE + bit;
|
||||||
@ -3492,9 +3430,6 @@ fail_exit:
|
|||||||
which it cannot do until we have buffered the IBUF_OP_DELETE
|
which it cannot do until we have buffered the IBUF_OP_DELETE
|
||||||
and done mtr_commit(&mtr) to release the latch. */
|
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);
|
ibuf_mtr_start(&bitmap_mtr);
|
||||||
index->set_modified(bitmap_mtr);
|
index->set_modified(bitmap_mtr);
|
||||||
|
|
||||||
@ -3637,17 +3572,6 @@ fail_exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
func_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);
|
ibuf_mtr_commit(&mtr);
|
||||||
btr_pcur_close(&pcur);
|
btr_pcur_close(&pcur);
|
||||||
|
|
||||||
@ -4339,14 +4263,6 @@ ibuf_delete_rec(
|
|||||||
ibuf->empty = true;
|
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);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4382,10 +4298,6 @@ ibuf_delete_rec(
|
|||||||
false, mtr);
|
false, mtr);
|
||||||
ut_a(err == DB_SUCCESS);
|
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);
|
ibuf_size_update(root);
|
||||||
mutex_exit(&ibuf_mutex);
|
mutex_exit(&ibuf_mutex);
|
||||||
|
|
||||||
@ -4768,10 +4680,6 @@ reset_bit:
|
|||||||
my_atomic_addlint(&ibuf->n_merges, 1);
|
my_atomic_addlint(&ibuf->n_merges, 1);
|
||||||
ibuf_add_ops(ibuf->n_merged_ops, mops);
|
ibuf_add_ops(ibuf->n_merged_ops, mops);
|
||||||
ibuf_add_ops(ibuf->n_discarded_ops, dops);
|
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 */
|
FILE* file) /*!< in: file where to print */
|
||||||
{
|
{
|
||||||
#ifdef UNIV_IBUF_COUNT_DEBUG
|
|
||||||
ulint i;
|
|
||||||
ulint j;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mutex_enter(&ibuf_mutex);
|
mutex_enter(&ibuf_mutex);
|
||||||
|
|
||||||
fprintf(file,
|
fprintf(file,
|
||||||
@ -4910,22 +4813,6 @@ ibuf_print(
|
|||||||
fputs("discarded operations:\n ", file);
|
fputs("discarded operations:\n ", file);
|
||||||
ibuf_print_ops(ibuf->n_discarded_ops, 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);
|
mutex_exit(&ibuf_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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 */
|
buf_block_t* block, /*!< in: block or NULL */
|
||||||
mtr_t* mtr); /*!< in: mtr 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.
|
Looks if the insert buffer is empty.
|
||||||
@return true if empty */
|
@return true if empty */
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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)
|
if (trx_t *trx= element->trx)
|
||||||
{
|
{
|
||||||
ut_ad(trx_state_eq(trx, TRX_STATE_PREPARED) ||
|
ut_ad(trx_state_eq(trx, TRX_STATE_PREPARED) ||
|
||||||
|
trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED) ||
|
||||||
(trx_state_eq(trx, TRX_STATE_ACTIVE) &&
|
(trx_state_eq(trx, TRX_STATE_ACTIVE) &&
|
||||||
(!srv_was_started ||
|
(!srv_was_started ||
|
||||||
srv_read_only_mode ||
|
srv_read_only_mode ||
|
||||||
@ -515,6 +516,7 @@ class rw_trx_hash_t
|
|||||||
ut_ad(!trx_is_autocommit_non_locking(trx));
|
ut_ad(!trx_is_autocommit_non_locking(trx));
|
||||||
mutex_enter(&trx->mutex);
|
mutex_enter(&trx->mutex);
|
||||||
ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE) ||
|
ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE) ||
|
||||||
|
trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED) ||
|
||||||
trx_state_eq(trx, TRX_STATE_PREPARED));
|
trx_state_eq(trx, TRX_STATE_PREPARED));
|
||||||
mutex_exit(&trx->mutex);
|
mutex_exit(&trx->mutex);
|
||||||
}
|
}
|
||||||
|
@ -447,7 +447,7 @@ Check transaction state */
|
|||||||
ut_ad(!trx_is_autocommit_non_locking((t))); \
|
ut_ad(!trx_is_autocommit_non_locking((t))); \
|
||||||
switch ((t)->state) { \
|
switch ((t)->state) { \
|
||||||
case TRX_STATE_PREPARED: \
|
case TRX_STATE_PREPARED: \
|
||||||
/* fall through */ \
|
case TRX_STATE_PREPARED_RECOVERED: \
|
||||||
case TRX_STATE_ACTIVE: \
|
case TRX_STATE_ACTIVE: \
|
||||||
case TRX_STATE_COMMITTED_IN_MEMORY: \
|
case TRX_STATE_COMMITTED_IN_MEMORY: \
|
||||||
continue; \
|
continue; \
|
||||||
@ -785,6 +785,7 @@ public:
|
|||||||
TRX_STATE_NOT_STARTED
|
TRX_STATE_NOT_STARTED
|
||||||
TRX_STATE_ACTIVE
|
TRX_STATE_ACTIVE
|
||||||
TRX_STATE_PREPARED
|
TRX_STATE_PREPARED
|
||||||
|
TRX_STATE_PREPARED_RECOVERED (special case of TRX_STATE_PREPARED)
|
||||||
TRX_STATE_COMMITTED_IN_MEMORY (alias below COMMITTED)
|
TRX_STATE_COMMITTED_IN_MEMORY (alias below COMMITTED)
|
||||||
|
|
||||||
Valid state transitions are:
|
Valid state transitions are:
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1996, 2015, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@ -47,7 +47,7 @@ trx_state_eq(
|
|||||||
#ifdef UNIV_DEBUG
|
#ifdef UNIV_DEBUG
|
||||||
switch (trx->state) {
|
switch (trx->state) {
|
||||||
case TRX_STATE_PREPARED:
|
case TRX_STATE_PREPARED:
|
||||||
|
case TRX_STATE_PREPARED_RECOVERED:
|
||||||
ut_ad(!trx_is_autocommit_non_locking(trx));
|
ut_ad(!trx_is_autocommit_non_locking(trx));
|
||||||
return(trx->state == state);
|
return(trx->state == state);
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1996, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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_NOT_STARTED,
|
||||||
|
|
||||||
TRX_STATE_ACTIVE,
|
TRX_STATE_ACTIVE,
|
||||||
|
/** XA PREPARE has been executed; only XA COMMIT or XA ROLLBACK
|
||||||
/** Support for 2PC/XA */
|
are possible */
|
||||||
TRX_STATE_PREPARED,
|
TRX_STATE_PREPARED,
|
||||||
|
/** XA PREPARE transaction that was returned to ha_recover() */
|
||||||
|
TRX_STATE_PREPARED_RECOVERED,
|
||||||
TRX_STATE_COMMITTED_IN_MEMORY
|
TRX_STATE_COMMITTED_IN_MEMORY
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
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.
|
Copyright (c) 2008, Google Inc.
|
||||||
|
|
||||||
Portions of this file contain modifications contributed and copyrighted by
|
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
|
this will break redo log file compatibility, but it may be useful when
|
||||||
debugging redo log application problems. */
|
debugging redo log application problems. */
|
||||||
#define UNIV_IBUF_DEBUG /* debug the insert buffer */
|
#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
|
#define UNIV_PERF_DEBUG /* debug flag that enables
|
||||||
light weight performance
|
light weight performance
|
||||||
related stuff. */
|
related stuff. */
|
||||||
|
@ -6307,6 +6307,7 @@ lock_trx_release_locks(
|
|||||||
{
|
{
|
||||||
check_trx_state(trx);
|
check_trx_state(trx);
|
||||||
ut_ad(trx_state_eq(trx, TRX_STATE_PREPARED)
|
ut_ad(trx_state_eq(trx, TRX_STATE_PREPARED)
|
||||||
|
|| trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED)
|
||||||
|| trx_state_eq(trx, TRX_STATE_ACTIVE));
|
|| trx_state_eq(trx, TRX_STATE_ACTIVE));
|
||||||
|
|
||||||
bool release_lock = UT_LIST_GET_LEN(trx->lock.trx_locks) > 0;
|
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) 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
|
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
|
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;
|
undo_node_t* undo;
|
||||||
|
|
||||||
ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE)
|
ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE)
|
||||||
|
|| trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED)
|
||||||
|| trx_state_eq(trx, TRX_STATE_PREPARED));
|
|| trx_state_eq(trx, TRX_STATE_PREPARED));
|
||||||
ut_ad(parent);
|
ut_ad(parent);
|
||||||
|
|
||||||
|
@ -1400,10 +1400,6 @@ dberr_t srv_start(bool create_new_db)
|
|||||||
|
|
||||||
#ifdef UNIV_IBUF_DEBUG
|
#ifdef UNIV_IBUF_DEBUG
|
||||||
ib::info() << "!!!!!!!! UNIV_IBUF_DEBUG switched on !!!!!!!!!";
|
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
|
#endif
|
||||||
|
|
||||||
#ifdef UNIV_LOG_LSN_DEBUG
|
#ifdef UNIV_LOG_LSN_DEBUG
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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));
|
return(trx_rollback_for_mysql_low(trx));
|
||||||
|
|
||||||
case TRX_STATE_PREPARED:
|
case TRX_STATE_PREPARED:
|
||||||
|
case TRX_STATE_PREPARED_RECOVERED:
|
||||||
ut_ad(!trx_is_autocommit_non_locking(trx));
|
ut_ad(!trx_is_autocommit_non_locking(trx));
|
||||||
if (trx->rsegs.m_redo.undo || trx->rsegs.m_redo.old_insert) {
|
if (trx->rsegs.m_redo.undo || trx->rsegs.m_redo.old_insert) {
|
||||||
/* Change the undo log state back from
|
/* Change the undo log state back from
|
||||||
@ -335,6 +336,7 @@ trx_rollback_last_sql_stat_for_mysql(
|
|||||||
return(err);
|
return(err);
|
||||||
|
|
||||||
case TRX_STATE_PREPARED:
|
case TRX_STATE_PREPARED:
|
||||||
|
case TRX_STATE_PREPARED_RECOVERED:
|
||||||
case TRX_STATE_COMMITTED_IN_MEMORY:
|
case TRX_STATE_COMMITTED_IN_MEMORY:
|
||||||
/* The statement rollback is only allowed on an ACTIVE
|
/* The statement rollback is only allowed on an ACTIVE
|
||||||
transaction, not a PREPARED or COMMITTED one. */
|
transaction, not a PREPARED or COMMITTED one. */
|
||||||
@ -508,6 +510,7 @@ trx_rollback_to_savepoint_for_mysql(
|
|||||||
trx, savep, mysql_binlog_cache_pos));
|
trx, savep, mysql_binlog_cache_pos));
|
||||||
|
|
||||||
case TRX_STATE_PREPARED:
|
case TRX_STATE_PREPARED:
|
||||||
|
case TRX_STATE_PREPARED_RECOVERED:
|
||||||
case TRX_STATE_COMMITTED_IN_MEMORY:
|
case TRX_STATE_COMMITTED_IN_MEMORY:
|
||||||
/* The savepoint rollback is only allowed on an ACTIVE
|
/* The savepoint rollback is only allowed on an ACTIVE
|
||||||
transaction, not a PREPARED or COMMITTED one. */
|
transaction, not a PREPARED or COMMITTED one. */
|
||||||
|
@ -466,6 +466,7 @@ trx_free_at_shutdown(trx_t *trx)
|
|||||||
{
|
{
|
||||||
ut_ad(trx->is_recovered);
|
ut_ad(trx->is_recovered);
|
||||||
ut_a(trx_state_eq(trx, TRX_STATE_PREPARED)
|
ut_a(trx_state_eq(trx, TRX_STATE_PREPARED)
|
||||||
|
|| trx_state_eq(trx, TRX_STATE_PREPARED_RECOVERED)
|
||||||
|| (trx_state_eq(trx, TRX_STATE_ACTIVE)
|
|| (trx_state_eq(trx, TRX_STATE_ACTIVE)
|
||||||
&& (!srv_was_started
|
&& (!srv_was_started
|
||||||
|| srv_operation == SRV_OPERATION_RESTORE
|
|| srv_operation == SRV_OPERATION_RESTORE
|
||||||
@ -1551,7 +1552,7 @@ trx_commit_or_rollback_prepare(
|
|||||||
|
|
||||||
case TRX_STATE_ACTIVE:
|
case TRX_STATE_ACTIVE:
|
||||||
case TRX_STATE_PREPARED:
|
case TRX_STATE_PREPARED:
|
||||||
|
case TRX_STATE_PREPARED_RECOVERED:
|
||||||
/* If the trx is in a lock wait state, moves the waiting
|
/* If the trx is in a lock wait state, moves the waiting
|
||||||
query thread to the suspended state */
|
query thread to the suspended state */
|
||||||
|
|
||||||
@ -1662,7 +1663,7 @@ trx_commit_for_mysql(
|
|||||||
/* fall through */
|
/* fall through */
|
||||||
case TRX_STATE_ACTIVE:
|
case TRX_STATE_ACTIVE:
|
||||||
case TRX_STATE_PREPARED:
|
case TRX_STATE_PREPARED:
|
||||||
|
case TRX_STATE_PREPARED_RECOVERED:
|
||||||
trx->op_info = "committing";
|
trx->op_info = "committing";
|
||||||
|
|
||||||
trx_commit(trx);
|
trx_commit(trx);
|
||||||
@ -1708,6 +1709,7 @@ trx_mark_sql_stat_end(
|
|||||||
|
|
||||||
switch (trx->state) {
|
switch (trx->state) {
|
||||||
case TRX_STATE_PREPARED:
|
case TRX_STATE_PREPARED:
|
||||||
|
case TRX_STATE_PREPARED_RECOVERED:
|
||||||
case TRX_STATE_COMMITTED_IN_MEMORY:
|
case TRX_STATE_COMMITTED_IN_MEMORY:
|
||||||
break;
|
break;
|
||||||
case TRX_STATE_NOT_STARTED:
|
case TRX_STATE_NOT_STARTED:
|
||||||
@ -1762,6 +1764,7 @@ trx_print_low(
|
|||||||
(ulong) difftime(time(NULL), trx->start_time));
|
(ulong) difftime(time(NULL), trx->start_time));
|
||||||
goto state_ok;
|
goto state_ok;
|
||||||
case TRX_STATE_PREPARED:
|
case TRX_STATE_PREPARED:
|
||||||
|
case TRX_STATE_PREPARED_RECOVERED:
|
||||||
fprintf(f, ", ACTIVE (PREPARED) %lu sec",
|
fprintf(f, ", ACTIVE (PREPARED) %lu sec",
|
||||||
(ulong) difftime(time(NULL), trx->start_time));
|
(ulong) difftime(time(NULL), trx->start_time));
|
||||||
goto state_ok;
|
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,
|
static my_bool trx_recover_for_mysql_callback(rw_trx_hash_element_t *element,
|
||||||
trx_recover_for_mysql_callback_arg *arg)
|
trx_recover_for_mysql_callback_arg *arg)
|
||||||
{
|
{
|
||||||
|
DBUG_ASSERT(arg->len > 0);
|
||||||
mutex_enter(&element->mutex);
|
mutex_enter(&element->mutex);
|
||||||
if (trx_t *trx= element->trx)
|
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))
|
if (trx_state_eq(trx, TRX_STATE_PREPARED))
|
||||||
{
|
{
|
||||||
ut_ad(trx->is_recovered);
|
ut_ad(trx->is_recovered);
|
||||||
|
ut_ad(trx->id);
|
||||||
if (arg->count == 0)
|
if (arg->count == 0)
|
||||||
ib::info() << "Starting recovery for XA transactions...";
|
ib::info() << "Starting recovery for XA transactions...";
|
||||||
ib::info() << "Transaction " << trx_get_id_for_print(trx)
|
XID& xid= arg->xid_list[arg->count];
|
||||||
<< " in prepared state after recovery";
|
if (arg->count++ < arg->len)
|
||||||
ib::info() << "Transaction contains changes to " << trx->undo_no
|
{
|
||||||
<< " rows";
|
trx->state= TRX_STATE_PREPARED_RECOVERED;
|
||||||
arg->xid_list[arg->count++]= *trx->xid;
|
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);
|
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_sys.rw_trx_hash.iterate_no_dups(reinterpret_cast<my_hash_walk_action>
|
||||||
(trx_recover_for_mysql_callback), &arg);
|
(trx_recover_for_mysql_callback), &arg);
|
||||||
if (arg.count)
|
if (arg.count)
|
||||||
|
{
|
||||||
ib::info() << arg.count
|
ib::info() << arg.count
|
||||||
<< " transactions in prepared state after recovery";
|
<< " transactions in prepared state after recovery";
|
||||||
return int(arg.count);
|
/* 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);
|
mutex_enter(&element->mutex);
|
||||||
if (trx_t *trx= element->trx)
|
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)))
|
arg->xid->eq(reinterpret_cast<XID*>(trx->xid)))
|
||||||
{
|
{
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
@ -2172,6 +2208,7 @@ trx_start_if_not_started_xa_low(
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
case TRX_STATE_PREPARED:
|
case TRX_STATE_PREPARED:
|
||||||
|
case TRX_STATE_PREPARED_RECOVERED:
|
||||||
case TRX_STATE_COMMITTED_IN_MEMORY:
|
case TRX_STATE_COMMITTED_IN_MEMORY:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2199,6 +2236,7 @@ trx_start_if_not_started_low(
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
case TRX_STATE_PREPARED:
|
case TRX_STATE_PREPARED:
|
||||||
|
case TRX_STATE_PREPARED_RECOVERED:
|
||||||
case TRX_STATE_COMMITTED_IN_MEMORY:
|
case TRX_STATE_COMMITTED_IN_MEMORY:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2265,6 +2303,7 @@ trx_start_for_ddl_low(
|
|||||||
|
|
||||||
case TRX_STATE_ACTIVE:
|
case TRX_STATE_ACTIVE:
|
||||||
case TRX_STATE_PREPARED:
|
case TRX_STATE_PREPARED:
|
||||||
|
case TRX_STATE_PREPARED_RECOVERED:
|
||||||
case TRX_STATE_COMMITTED_IN_MEMORY:
|
case TRX_STATE_COMMITTED_IN_MEMORY:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -362,7 +362,7 @@ int test_write(MARIA_HA *file,int id,int lock_type)
|
|||||||
maria_extra(file,HA_EXTRA_WRITE_CACHE,0);
|
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));
|
strnmov((char*) record.text,"Testing...", sizeof(record.text));
|
||||||
|
|
||||||
tries=(uint) rnd(100)+10;
|
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;
|
null_bit[0]=null_pos[0]=0;
|
||||||
if (keyseg->null_bit)
|
if (keyseg->null_bit)
|
||||||
{
|
{
|
||||||
sprintf(null_bit,"%d",keyseg->null_bit);
|
my_snprintf(null_bit, sizeof(null_bit), "%d", keyseg->null_bit);
|
||||||
sprintf(null_pos,"%ld",(long) keyseg->null_pos+1);
|
my_snprintf(null_pos, sizeof(null_pos), "%ld", (long) keyseg->null_pos+1);
|
||||||
}
|
}
|
||||||
printf("%-7ld%-5d%-9s%-10s%-30s\n",
|
printf("%-7ld%-5d%-9s%-10s%-30s\n",
|
||||||
(long) keyseg->start+1,keyseg->length,
|
(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);
|
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));
|
strnmov((char*) record.text,"Testing...", sizeof(record.text));
|
||||||
|
|
||||||
tries=(uint) rnd(100)+10;
|
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;
|
null_bit[0]=null_pos[0]=0;
|
||||||
if (keyseg->null_bit)
|
if (keyseg->null_bit)
|
||||||
{
|
{
|
||||||
sprintf(null_bit,"%d",keyseg->null_bit);
|
my_snprintf(null_bit, sizeof(null_bit), "%d", keyseg->null_bit);
|
||||||
sprintf(null_pos,"%ld",(long) keyseg->null_pos+1);
|
my_snprintf(null_pos, sizeof(null_pos), "%ld", (long) keyseg->null_pos+1);
|
||||||
}
|
}
|
||||||
printf("%-7ld%-5d%-9s%-10s%-30s\n",
|
printf("%-7ld%-5d%-9s%-10s%-30s\n",
|
||||||
(long) keyseg->start+1,keyseg->length,
|
(long) keyseg->start+1,keyseg->length,
|
||||||
|
@ -34,14 +34,8 @@ struct PFS_events
|
|||||||
ulonglong m_event_id;
|
ulonglong m_event_id;
|
||||||
/** END_EVENT_ID. */
|
/** END_EVENT_ID. */
|
||||||
ulonglong m_end_event_id;
|
ulonglong m_end_event_id;
|
||||||
/** (EVENT_TYPE) */
|
|
||||||
enum_event_type m_event_type;
|
|
||||||
/** NESTING_EVENT_ID. */
|
/** NESTING_EVENT_ID. */
|
||||||
ulonglong m_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.
|
Timer start.
|
||||||
This member is populated only if m_class->m_timed is true.
|
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.
|
This member is populated only if m_class->m_timed is true.
|
||||||
*/
|
*/
|
||||||
ulonglong m_timer_end;
|
ulonglong m_timer_end;
|
||||||
|
/** Instrument metadata. */
|
||||||
|
PFS_instr_class *m_class;
|
||||||
/** Location of the instrumentation in the source code (file name). */
|
/** Location of the instrumentation in the source code (file name). */
|
||||||
const char *m_source_file;
|
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). */
|
/** Location of the instrumentation in the source code (line number). */
|
||||||
uint m_source_line;
|
uint m_source_line;
|
||||||
};
|
};
|
||||||
|
@ -55,6 +55,23 @@ enum events_waits_class
|
|||||||
/** A wait event record. */
|
/** A wait event record. */
|
||||||
struct PFS_events_waits : public PFS_events
|
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.
|
The type of wait.
|
||||||
Readers:
|
Readers:
|
||||||
@ -67,34 +84,17 @@ struct PFS_events_waits : public PFS_events
|
|||||||
- TRUNCATE EVENTS_WAITS_HISTORY_LONG
|
- TRUNCATE EVENTS_WAITS_HISTORY_LONG
|
||||||
*/
|
*/
|
||||||
events_waits_class m_wait_class;
|
events_waits_class m_wait_class;
|
||||||
/** Executing thread. */
|
|
||||||
PFS_thread *m_thread;
|
|
||||||
/** Object type */
|
/** Object type */
|
||||||
enum_object_type m_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. */
|
/** For weak pointers, target object version. */
|
||||||
uint32 m_weak_version;
|
uint32 m_weak_version;
|
||||||
/** Address in memory of the object instance waited on. */
|
|
||||||
const void *m_object_instance_addr;
|
|
||||||
/** Operation performed. */
|
/** Operation performed. */
|
||||||
enum_operation_type m_operation;
|
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.
|
Index used.
|
||||||
This member is populated for TABLE IO operations only.
|
This member is populated for TABLE IO operations only.
|
||||||
*/
|
*/
|
||||||
uint m_index;
|
uint m_index;
|
||||||
/** Flags */
|
|
||||||
ulong m_flags;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** TIMED bit in the state flags bitfield. */
|
/** TIMED bit in the state flags bitfield. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user