Merge 10.6 into 10.11
This commit is contained in:
commit
0c204bfb87
@ -1,16 +1,15 @@
|
|||||||
***MDEV-5914: Parallel replication deadlock due to InnoDB lock conflicts ***
|
***MDEV-5914: Parallel replication deadlock due to InnoDB lock conflicts ***
|
||||||
include/master-slave.inc
|
include/master-slave.inc
|
||||||
[connection master]
|
[connection master]
|
||||||
connection server_2;
|
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
|
||||||
SET sql_log_bin=0;
|
CALL mtr.add_suppression("InnoDB: Transaction was aborted due to ");
|
||||||
CALL mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends");
|
CALL mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends");
|
||||||
SET sql_log_bin=1;
|
connection server_2;
|
||||||
SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads;
|
SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads;
|
||||||
include/stop_slave.inc
|
include/stop_slave.inc
|
||||||
SET GLOBAL slave_parallel_threads=10;
|
SET GLOBAL slave_parallel_threads=10;
|
||||||
CHANGE MASTER TO master_use_gtid=slave_pos;
|
CHANGE MASTER TO master_use_gtid=slave_pos;
|
||||||
connection server_1;
|
connection server_1;
|
||||||
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
|
|
||||||
CREATE TABLE t4 (a INT PRIMARY KEY, b INT, KEY b_idx(b)) ENGINE=InnoDB;
|
CREATE TABLE t4 (a INT PRIMARY KEY, b INT, KEY b_idx(b)) ENGINE=InnoDB;
|
||||||
INSERT INTO t4 VALUES (1,NULL), (2,2), (3,NULL), (4,4), (5, NULL), (6, 6);
|
INSERT INTO t4 VALUES (1,NULL), (2,2), (3,NULL), (4,4), (5, NULL), (6, 6);
|
||||||
connect con1,127.0.0.1,root,,test,$SERVER_MYPORT_1,;
|
connect con1,127.0.0.1,root,,test,$SERVER_MYPORT_1,;
|
||||||
|
@ -31,3 +31,6 @@ test.t1 repair note The storage engine for the table doesn't support repair
|
|||||||
test.t2 repair note The storage engine for the table doesn't support repair
|
test.t2 repair note The storage engine for the table doesn't support repair
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
|
connection node_1;
|
||||||
|
disconnect node_2a;
|
||||||
|
disconnect node_2b;
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
!include ../galera_2nodes.cnf
|
|
||||||
|
|
||||||
[mysqld.1]
|
|
||||||
wsrep-debug=1
|
|
||||||
loose-galera-bf-abort-lock-table=1
|
|
@ -1,6 +1,5 @@
|
|||||||
--source include/galera_cluster.inc
|
--source include/galera_cluster.inc
|
||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
--source include/force_restart.inc
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Test that a local LOCK TABLE will NOT be broken by an incoming remote transaction against that table
|
# Test that a local LOCK TABLE will NOT be broken by an incoming remote transaction against that table
|
||||||
@ -18,15 +17,15 @@ INSERT INTO t1 VALUES (2);
|
|||||||
|
|
||||||
--connection node_2
|
--connection node_2
|
||||||
SET SESSION wsrep_sync_wait = 0;
|
SET SESSION wsrep_sync_wait = 0;
|
||||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock'
|
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND (STATE LIKE 'Waiting for table metadata lock%' OR STATE LIKE 'Waiting to execute in isolation%');
|
||||||
--let $wait_condition_on_error_output = SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
|
--let $wait_condition_on_error_output = SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
|
||||||
--source include/wait_condition_with_debug_and_kill.inc
|
--source include/wait_condition_with_debug.inc
|
||||||
|
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
||||||
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'Waiting for table metadata lock'
|
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND (STATE LIKE 'Waiting for table metadata lock%' OR STATE LIKE 'Waiting to execute in isolation%');
|
||||||
--let $wait_condition_on_error_output = SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
|
--let $wait_condition_on_error_output = SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
|
||||||
--source include/wait_condition_with_debug_and_kill.inc
|
--source include/wait_condition_with_debug.inc
|
||||||
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
SELECT COUNT(*) = 1 FROM t1;
|
SELECT COUNT(*) = 1 FROM t1;
|
||||||
|
@ -2,5 +2,3 @@
|
|||||||
|
|
||||||
[mysqld]
|
[mysqld]
|
||||||
log-bin
|
log-bin
|
||||||
wsrep-debug=1
|
|
||||||
loose-mysql-wsrep198=1
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
--source include/galera_cluster.inc
|
--source include/galera_cluster.inc
|
||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
--source include/force_restart.inc
|
|
||||||
|
|
||||||
CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB;
|
CREATE TABLE t1 (id INT PRIMARY KEY) ENGINE=InnoDB;
|
||||||
CREATE TABLE t2 (id INT PRIMARY KEY) ENGINE=InnoDB;
|
CREATE TABLE t2 (id INT PRIMARY KEY) ENGINE=InnoDB;
|
||||||
@ -21,7 +20,7 @@ LOCK TABLE t2 WRITE;
|
|||||||
|
|
||||||
--connection node_2
|
--connection node_2
|
||||||
SET SESSION wsrep_sync_wait = 0;
|
SET SESSION wsrep_sync_wait = 0;
|
||||||
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'Waiting for table metadata lock'
|
--let $wait_condition = SELECT COUNT(*) BETWEEN 1 AND 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Waiting for table metadata lock%' OR STATE LIKE 'Waiting to execute in isolation%';
|
||||||
--let $wait_condition_on_error_output = SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
|
--let $wait_condition_on_error_output = SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
|
||||||
--source include/wait_condition_with_debug_and_kill.inc
|
--source include/wait_condition_with_debug_and_kill.inc
|
||||||
|
|
||||||
@ -39,3 +38,8 @@ UNLOCK TABLES;
|
|||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
|
||||||
|
--disconnect node_2a
|
||||||
|
--disconnect node_2b
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
@@ -13,212 +13,212 @@
|
--- autoinc_persist.result
|
||||||
|
+++ autoinc_persist.result,desc
|
||||||
|
@@ -13,224 +13,224 @@
|
||||||
#
|
#
|
||||||
# Pre-create several tables
|
# Pre-create several tables
|
||||||
SET SQL_MODE='STRICT_ALL_TABLES';
|
SET SQL_MODE='STRICT_ALL_TABLES';
|
||||||
@ -296,8 +298,7 @@
|
|||||||
+2
|
+2
|
||||||
+1
|
+1
|
||||||
+CREATE TABLE t11(a FLOAT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
+CREATE TABLE t11(a FLOAT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
||||||
INSERT INTO t11 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
INSERT INTO t11 VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31);
|
||||||
(20), (30), (31);
|
|
||||||
SELECT * FROM t11;
|
SELECT * FROM t11;
|
||||||
a
|
a
|
||||||
--10
|
--10
|
||||||
@ -310,7 +311,7 @@
|
|||||||
-20
|
-20
|
||||||
-30
|
-30
|
||||||
31
|
31
|
||||||
-CREATE TABLE t12(a DOUBLE AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
-CREATE TABLE t11u(a FLOAT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
+30
|
+30
|
||||||
+20
|
+20
|
||||||
+5
|
+5
|
||||||
@ -320,9 +321,30 @@
|
|||||||
+1
|
+1
|
||||||
+-1
|
+-1
|
||||||
+-10
|
+-10
|
||||||
|
+CREATE TABLE t11u(a FLOAT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
||||||
|
INSERT INTO t11u VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31);
|
||||||
|
ERROR 22003: Out of range value for column 'a' at row 5
|
||||||
|
INSERT INTO t11u VALUES(0), (0), (0), (0), (0), (20), (30), (31);
|
||||||
|
SELECT * FROM t11u;
|
||||||
|
a
|
||||||
|
-11
|
||||||
|
-12
|
||||||
|
-13
|
||||||
|
-14
|
||||||
|
-15
|
||||||
|
-20
|
||||||
|
-30
|
||||||
|
31
|
||||||
|
-CREATE TABLE t12(a DOUBLE AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
+30
|
||||||
|
+20
|
||||||
|
+15
|
||||||
|
+14
|
||||||
|
+13
|
||||||
|
+12
|
||||||
|
+11
|
||||||
+CREATE TABLE t12(a DOUBLE AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
+CREATE TABLE t12(a DOUBLE AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
||||||
INSERT INTO t12 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
INSERT INTO t12 VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31);
|
||||||
(20), (30), (31);
|
|
||||||
SELECT * FROM t12;
|
SELECT * FROM t12;
|
||||||
a
|
a
|
||||||
--10
|
--10
|
||||||
@ -344,10 +366,10 @@
|
|||||||
+1
|
+1
|
||||||
+-1
|
+-1
|
||||||
+-10
|
+-10
|
||||||
# Scenario 1: Normal restart, to test if the counters are persisted
|
CREATE TABLE t12u(a DOUBLE UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
# Scenario 2: Delete some values, to test the counters should not be the
|
INSERT INTO t12u VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31);
|
||||||
# one which is the largest in current table
|
ERROR 22003: Out of range value for column 'a' at row 5
|
||||||
@@ -242,14 +242,14 @@
|
@@ -268,14 +268,14 @@
|
||||||
SELECT MAX(a) AS `Expect 100000000000` FROM t9;
|
SELECT MAX(a) AS `Expect 100000000000` FROM t9;
|
||||||
Expect 100000000000
|
Expect 100000000000
|
||||||
100000000000
|
100000000000
|
||||||
@ -364,7 +386,7 @@
|
|||||||
) ENGINE=InnoDB AUTO_INCREMENT=1234 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
) ENGINE=InnoDB AUTO_INCREMENT=1234 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
INSERT INTO t13 VALUES(0);
|
INSERT INTO t13 VALUES(0);
|
||||||
SELECT a AS `Expect 1234` FROM t13;
|
SELECT a AS `Expect 1234` FROM t13;
|
||||||
@@ -464,28 +464,28 @@
|
@@ -490,28 +490,28 @@
|
||||||
INSERT INTO t1 VALUES(0), (0);
|
INSERT INTO t1 VALUES(0), (0);
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
a
|
a
|
||||||
@ -398,7 +420,7 @@
|
|||||||
# Ensure that all changes before the server is killed are persisted.
|
# Ensure that all changes before the server is killed are persisted.
|
||||||
set global innodb_flush_log_at_trx_commit=1;
|
set global innodb_flush_log_at_trx_commit=1;
|
||||||
TRUNCATE TABLE t1;
|
TRUNCATE TABLE t1;
|
||||||
@@ -498,63 +498,63 @@
|
@@ -524,63 +524,63 @@
|
||||||
INSERT INTO t19 VALUES(0), (0);
|
INSERT INTO t19 VALUES(0), (0);
|
||||||
SELECT * FROM t19;
|
SELECT * FROM t19;
|
||||||
a
|
a
|
||||||
@ -481,7 +503,7 @@
|
|||||||
DELETE FROM t3 WHERE a > 300;
|
DELETE FROM t3 WHERE a > 300;
|
||||||
SELECT MAX(a) AS `Expect 200` FROM t3;
|
SELECT MAX(a) AS `Expect 200` FROM t3;
|
||||||
Expect 200
|
Expect 200
|
||||||
@@ -566,7 +566,7 @@
|
@@ -592,7 +592,7 @@
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t3 CREATE TABLE `t3` (
|
t3 CREATE TABLE `t3` (
|
||||||
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
@ -490,7 +512,7 @@
|
|||||||
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
INSERT INTO t3 VALUES(0);
|
INSERT INTO t3 VALUES(0);
|
||||||
SELECT MAX(a) AS `Expect 201` FROM t3;
|
SELECT MAX(a) AS `Expect 201` FROM t3;
|
||||||
@@ -579,7 +579,7 @@
|
@@ -605,7 +605,7 @@
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t3 CREATE TABLE `t3` (
|
t3 CREATE TABLE `t3` (
|
||||||
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
@ -499,7 +521,7 @@
|
|||||||
) ENGINE=InnoDB AUTO_INCREMENT=500 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
) ENGINE=InnoDB AUTO_INCREMENT=500 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
INSERT INTO t3 VALUES(0);
|
INSERT INTO t3 VALUES(0);
|
||||||
SELECT MAX(a) AS `Expect 500` FROM t3;
|
SELECT MAX(a) AS `Expect 500` FROM t3;
|
||||||
@@ -591,13 +591,13 @@
|
@@ -617,13 +617,13 @@
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t3 CREATE TABLE `t3` (
|
t3 CREATE TABLE `t3` (
|
||||||
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
@ -515,7 +537,7 @@
|
|||||||
INSERT INTO t3 VALUES(150), (180);
|
INSERT INTO t3 VALUES(150), (180);
|
||||||
UPDATE t3 SET a = 200 WHERE a = 150;
|
UPDATE t3 SET a = 200 WHERE a = 150;
|
||||||
INSERT INTO t3 VALUES(220);
|
INSERT INTO t3 VALUES(220);
|
||||||
@@ -607,7 +607,7 @@
|
@@ -633,7 +633,7 @@
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t3 CREATE TABLE `t3` (
|
t3 CREATE TABLE `t3` (
|
||||||
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
@ -524,7 +546,7 @@
|
|||||||
) ENGINE=InnoDB AUTO_INCREMENT=221 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
) ENGINE=InnoDB AUTO_INCREMENT=221 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
INSERT INTO t3 VALUES(0);
|
INSERT INTO t3 VALUES(0);
|
||||||
SELECT MAX(a) AS `Expect 221` FROM t3;
|
SELECT MAX(a) AS `Expect 221` FROM t3;
|
||||||
@@ -619,7 +619,7 @@
|
@@ -645,7 +645,7 @@
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t3 CREATE TABLE `t3` (
|
t3 CREATE TABLE `t3` (
|
||||||
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
@ -533,7 +555,7 @@
|
|||||||
) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
# MDEV-6076: Test adding an AUTO_INCREMENT COLUMN
|
# MDEV-6076: Test adding an AUTO_INCREMENT COLUMN
|
||||||
CREATE TABLE mdev6076a (b INT) ENGINE=InnoDB;
|
CREATE TABLE mdev6076a (b INT) ENGINE=InnoDB;
|
||||||
@@ -669,18 +669,18 @@
|
@@ -695,18 +695,18 @@
|
||||||
INSERT INTO t_inplace SELECT * FROM t3;
|
INSERT INTO t_inplace SELECT * FROM t3;
|
||||||
SELECT * FROM t_inplace;
|
SELECT * FROM t_inplace;
|
||||||
a
|
a
|
||||||
@ -559,7 +581,7 @@
|
|||||||
) ENGINE=InnoDB AUTO_INCREMENT=211 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
) ENGINE=InnoDB AUTO_INCREMENT=211 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
# This will keep the autoinc counter
|
# This will keep the autoinc counter
|
||||||
ALTER TABLE t_inplace AUTO_INCREMENT = 250, ALGORITHM = INPLACE;
|
ALTER TABLE t_inplace AUTO_INCREMENT = 250, ALGORITHM = INPLACE;
|
||||||
@@ -689,7 +689,7 @@
|
@@ -715,7 +715,7 @@
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t_inplace CREATE TABLE `t_inplace` (
|
t_inplace CREATE TABLE `t_inplace` (
|
||||||
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
@ -568,7 +590,7 @@
|
|||||||
) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
# This should keep the autoinc counter as well
|
# This should keep the autoinc counter as well
|
||||||
ALTER TABLE t_inplace ADD COLUMN b INT, ALGORITHM = INPLACE;
|
ALTER TABLE t_inplace ADD COLUMN b INT, ALGORITHM = INPLACE;
|
||||||
@@ -699,16 +699,16 @@
|
@@ -725,16 +725,16 @@
|
||||||
t_inplace CREATE TABLE `t_inplace` (
|
t_inplace CREATE TABLE `t_inplace` (
|
||||||
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
`b` int(11) DEFAULT NULL,
|
`b` int(11) DEFAULT NULL,
|
||||||
@ -590,7 +612,7 @@
|
|||||||
# This should reset the autoinc counter to the one specified
|
# This should reset the autoinc counter to the one specified
|
||||||
# Since it's smaller than current one but bigger than existing
|
# Since it's smaller than current one but bigger than existing
|
||||||
# biggest counter in the table
|
# biggest counter in the table
|
||||||
@@ -719,7 +719,7 @@
|
@@ -745,7 +745,7 @@
|
||||||
t_inplace CREATE TABLE `t_inplace` (
|
t_inplace CREATE TABLE `t_inplace` (
|
||||||
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
`b` int(11) DEFAULT NULL,
|
`b` int(11) DEFAULT NULL,
|
||||||
@ -599,7 +621,7 @@
|
|||||||
) ENGINE=InnoDB AUTO_INCREMENT=180 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
) ENGINE=InnoDB AUTO_INCREMENT=180 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
# This should reset the autoinc counter to the next value of
|
# This should reset the autoinc counter to the next value of
|
||||||
# current max counter in the table, since the specified value
|
# current max counter in the table, since the specified value
|
||||||
@@ -730,7 +730,7 @@
|
@@ -756,7 +756,7 @@
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t_inplace CREATE TABLE `t_inplace` (
|
t_inplace CREATE TABLE `t_inplace` (
|
||||||
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
@ -608,7 +630,7 @@
|
|||||||
) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
INSERT INTO t_inplace VALUES(0), (0);
|
INSERT INTO t_inplace VALUES(0), (0);
|
||||||
SELECT MAX(a) AS `Expect 124` FROM t_inplace;
|
SELECT MAX(a) AS `Expect 124` FROM t_inplace;
|
||||||
@@ -757,18 +757,18 @@
|
@@ -783,18 +783,18 @@
|
||||||
INSERT INTO t_copy SELECT * FROM t3;
|
INSERT INTO t_copy SELECT * FROM t3;
|
||||||
SELECT * FROM t_copy;
|
SELECT * FROM t_copy;
|
||||||
a
|
a
|
||||||
@ -634,7 +656,7 @@
|
|||||||
) ENGINE=InnoDB AUTO_INCREMENT=211 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
) ENGINE=InnoDB AUTO_INCREMENT=211 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
# This will keep the autoinc counter
|
# This will keep the autoinc counter
|
||||||
ALTER TABLE t_copy AUTO_INCREMENT = 250, ALGORITHM = COPY;
|
ALTER TABLE t_copy AUTO_INCREMENT = 250, ALGORITHM = COPY;
|
||||||
@@ -777,7 +777,7 @@
|
@@ -803,7 +803,7 @@
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t_copy CREATE TABLE `t_copy` (
|
t_copy CREATE TABLE `t_copy` (
|
||||||
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
@ -643,7 +665,7 @@
|
|||||||
) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
# This should keep the autoinc counter as well
|
# This should keep the autoinc counter as well
|
||||||
ALTER TABLE t_copy ADD COLUMN b INT, ALGORITHM = COPY;
|
ALTER TABLE t_copy ADD COLUMN b INT, ALGORITHM = COPY;
|
||||||
@@ -787,16 +787,16 @@
|
@@ -813,16 +813,16 @@
|
||||||
t_copy CREATE TABLE `t_copy` (
|
t_copy CREATE TABLE `t_copy` (
|
||||||
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
`b` int(11) DEFAULT NULL,
|
`b` int(11) DEFAULT NULL,
|
||||||
@ -665,7 +687,7 @@
|
|||||||
# This should reset the autoinc counter to the one specified
|
# This should reset the autoinc counter to the one specified
|
||||||
# Since it's smaller than current one but bigger than existing
|
# Since it's smaller than current one but bigger than existing
|
||||||
# biggest counter in the table
|
# biggest counter in the table
|
||||||
@@ -807,7 +807,7 @@
|
@@ -833,7 +833,7 @@
|
||||||
t_copy CREATE TABLE `t_copy` (
|
t_copy CREATE TABLE `t_copy` (
|
||||||
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
`b` int(11) DEFAULT NULL,
|
`b` int(11) DEFAULT NULL,
|
||||||
@ -674,7 +696,7 @@
|
|||||||
) ENGINE=InnoDB AUTO_INCREMENT=180 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
) ENGINE=InnoDB AUTO_INCREMENT=180 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
# This should reset the autoinc counter to the next value of
|
# This should reset the autoinc counter to the next value of
|
||||||
# current max counter in the table, since the specified value
|
# current max counter in the table, since the specified value
|
||||||
@@ -818,7 +818,7 @@
|
@@ -844,7 +844,7 @@
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t_copy CREATE TABLE `t_copy` (
|
t_copy CREATE TABLE `t_copy` (
|
||||||
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
@ -683,7 +705,7 @@
|
|||||||
) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
INSERT INTO t_copy VALUES(0), (0);
|
INSERT INTO t_copy VALUES(0), (0);
|
||||||
SELECT MAX(a) AS `Expect 124` FROM t_copy;
|
SELECT MAX(a) AS `Expect 124` FROM t_copy;
|
||||||
@@ -842,7 +842,7 @@
|
@@ -868,7 +868,7 @@
|
||||||
126
|
126
|
||||||
DROP TABLE t_copy, it_copy;
|
DROP TABLE t_copy, it_copy;
|
||||||
# Scenario 9: Test the sql_mode = NO_AUTO_VALUE_ON_ZERO
|
# Scenario 9: Test the sql_mode = NO_AUTO_VALUE_ON_ZERO
|
||||||
@ -692,7 +714,7 @@
|
|||||||
set SQL_MODE = NO_AUTO_VALUE_ON_ZERO;
|
set SQL_MODE = NO_AUTO_VALUE_ON_ZERO;
|
||||||
INSERT INTO t30 VALUES(NULL, 1), (200, 2), (0, 3);
|
INSERT INTO t30 VALUES(NULL, 1), (200, 2), (0, 3);
|
||||||
INSERT INTO t30(b) VALUES(4), (5), (6), (7);
|
INSERT INTO t30(b) VALUES(4), (5), (6), (7);
|
||||||
@@ -869,20 +869,20 @@
|
@@ -895,20 +895,20 @@
|
||||||
set global innodb_flush_log_at_trx_commit=1;
|
set global innodb_flush_log_at_trx_commit=1;
|
||||||
CREATE TABLE t31 (a INT) ENGINE = InnoDB;
|
CREATE TABLE t31 (a INT) ENGINE = InnoDB;
|
||||||
INSERT INTO t31 VALUES(1), (2);
|
INSERT INTO t31 VALUES(1), (2);
|
||||||
@ -719,7 +741,7 @@
|
|||||||
INSERT INTO t32 VALUES(0), (0);
|
INSERT INTO t32 VALUES(0), (0);
|
||||||
# Ensure that all changes before the server is killed are persisted.
|
# Ensure that all changes before the server is killed are persisted.
|
||||||
set global innodb_flush_log_at_trx_commit=1;
|
set global innodb_flush_log_at_trx_commit=1;
|
||||||
@@ -897,7 +897,7 @@
|
@@ -923,7 +923,7 @@
|
||||||
# increasing the counter
|
# increasing the counter
|
||||||
CREATE TABLE t33 (
|
CREATE TABLE t33 (
|
||||||
a BIGINT NOT NULL PRIMARY KEY,
|
a BIGINT NOT NULL PRIMARY KEY,
|
||||||
@ -728,7 +750,7 @@
|
|||||||
INSERT INTO t33 VALUES(1, NULL);
|
INSERT INTO t33 VALUES(1, NULL);
|
||||||
INSERT INTO t33 VALUES(2, NULL);
|
INSERT INTO t33 VALUES(2, NULL);
|
||||||
INSERT INTO t33 VALUES(2, NULL);
|
INSERT INTO t33 VALUES(2, NULL);
|
||||||
@@ -920,13 +920,13 @@
|
@@ -946,13 +946,13 @@
|
||||||
INSERT INTO t31(a) VALUES(6), (0);
|
INSERT INTO t31(a) VALUES(6), (0);
|
||||||
SELECT * FROM t31;
|
SELECT * FROM t31;
|
||||||
a b
|
a b
|
||||||
@ -748,7 +770,7 @@
|
|||||||
DROP TABLE t31;
|
DROP TABLE t31;
|
||||||
set SQL_MODE = NO_AUTO_VALUE_ON_ZERO;
|
set SQL_MODE = NO_AUTO_VALUE_ON_ZERO;
|
||||||
DELETE FROM t30 WHERE a = 0;
|
DELETE FROM t30 WHERE a = 0;
|
||||||
@@ -965,7 +965,7 @@
|
@@ -991,7 +991,7 @@
|
||||||
DROP TABLE t33;
|
DROP TABLE t33;
|
||||||
CREATE TABLE t33 (
|
CREATE TABLE t33 (
|
||||||
a BIGINT NOT NULL PRIMARY KEY,
|
a BIGINT NOT NULL PRIMARY KEY,
|
||||||
@ -757,7 +779,7 @@
|
|||||||
ALTER TABLE t33 DISCARD TABLESPACE;
|
ALTER TABLE t33 DISCARD TABLESPACE;
|
||||||
restore: t33 .ibd and .cfg files
|
restore: t33 .ibd and .cfg files
|
||||||
ALTER TABLE t33 IMPORT TABLESPACE;
|
ALTER TABLE t33 IMPORT TABLESPACE;
|
||||||
@@ -975,7 +975,7 @@
|
@@ -1001,8 +1001,8 @@
|
||||||
4
|
4
|
||||||
SELECT * FROM t33;
|
SELECT * FROM t33;
|
||||||
a b
|
a b
|
||||||
@ -766,4 +788,5 @@
|
|||||||
3 4
|
3 4
|
||||||
+2 2
|
+2 2
|
||||||
+10 1
|
+10 1
|
||||||
DROP TABLE t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t30, t32, t33;
|
DROP TABLE t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t11u, t12u,
|
||||||
|
t30, t32, t33;
|
||||||
|
@ -190,8 +190,7 @@ a
|
|||||||
100000000000
|
100000000000
|
||||||
100000000006
|
100000000006
|
||||||
CREATE TABLE t11(a FLOAT AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
CREATE TABLE t11(a FLOAT AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
INSERT INTO t11 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
INSERT INTO t11 VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31);
|
||||||
(20), (30), (31);
|
|
||||||
SELECT * FROM t11;
|
SELECT * FROM t11;
|
||||||
a
|
a
|
||||||
-10
|
-10
|
||||||
@ -204,9 +203,22 @@ a
|
|||||||
20
|
20
|
||||||
30
|
30
|
||||||
31
|
31
|
||||||
|
CREATE TABLE t11u(a FLOAT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
INSERT INTO t11u VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31);
|
||||||
|
ERROR 22003: Out of range value for column 'a' at row 5
|
||||||
|
INSERT INTO t11u VALUES(0), (0), (0), (0), (0), (20), (30), (31);
|
||||||
|
SELECT * FROM t11u;
|
||||||
|
a
|
||||||
|
11
|
||||||
|
12
|
||||||
|
13
|
||||||
|
14
|
||||||
|
15
|
||||||
|
20
|
||||||
|
30
|
||||||
|
31
|
||||||
CREATE TABLE t12(a DOUBLE AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
CREATE TABLE t12(a DOUBLE AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
INSERT INTO t12 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
INSERT INTO t12 VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31);
|
||||||
(20), (30), (31);
|
|
||||||
SELECT * FROM t12;
|
SELECT * FROM t12;
|
||||||
a
|
a
|
||||||
-10
|
-10
|
||||||
@ -219,6 +231,20 @@ a
|
|||||||
20
|
20
|
||||||
30
|
30
|
||||||
31
|
31
|
||||||
|
CREATE TABLE t12u(a DOUBLE UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
INSERT INTO t12u VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31);
|
||||||
|
ERROR 22003: Out of range value for column 'a' at row 5
|
||||||
|
INSERT INTO t12u VALUES(0), (0), (0), (0), (0), (20), (30), (31);
|
||||||
|
SELECT * FROM t12u;
|
||||||
|
a
|
||||||
|
11
|
||||||
|
12
|
||||||
|
13
|
||||||
|
14
|
||||||
|
15
|
||||||
|
20
|
||||||
|
30
|
||||||
|
31
|
||||||
# Scenario 1: Normal restart, to test if the counters are persisted
|
# Scenario 1: Normal restart, to test if the counters are persisted
|
||||||
# Scenario 2: Delete some values, to test the counters should not be the
|
# Scenario 2: Delete some values, to test the counters should not be the
|
||||||
# one which is the largest in current table
|
# one which is the largest in current table
|
||||||
@ -978,4 +1004,5 @@ a b
|
|||||||
10 1
|
10 1
|
||||||
2 2
|
2 2
|
||||||
3 4
|
3 4
|
||||||
DROP TABLE t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t30, t32, t33;
|
DROP TABLE t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t11u, t12u,
|
||||||
|
t30, t32, t33;
|
||||||
|
@ -95,15 +95,25 @@ INSERT INTO t10 VALUES(0), (0), (0), (0), (8), (10), (0),
|
|||||||
SELECT * FROM t10;
|
SELECT * FROM t10;
|
||||||
|
|
||||||
eval CREATE TABLE t11(a FLOAT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
|
eval CREATE TABLE t11(a FLOAT $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
|
||||||
INSERT INTO t11 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
INSERT INTO t11 VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31);
|
||||||
(20), (30), (31);
|
|
||||||
SELECT * FROM t11;
|
SELECT * FROM t11;
|
||||||
|
|
||||||
|
eval CREATE TABLE t11u(a FLOAT UNSIGNED $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
|
||||||
|
--error ER_WARN_DATA_OUT_OF_RANGE
|
||||||
|
INSERT INTO t11u VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31);
|
||||||
|
INSERT INTO t11u VALUES(0), (0), (0), (0), (0), (20), (30), (31);
|
||||||
|
SELECT * FROM t11u;
|
||||||
|
|
||||||
eval CREATE TABLE t12(a DOUBLE $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
|
eval CREATE TABLE t12(a DOUBLE $AUTO_INCREMENT_KEY_a) ENGINE = InnoDB;
|
||||||
INSERT INTO t12 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
INSERT INTO t12 VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31);
|
||||||
(20), (30), (31);
|
|
||||||
SELECT * FROM t12;
|
SELECT * FROM t12;
|
||||||
|
|
||||||
|
CREATE TABLE t12u(a DOUBLE UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
--error ER_WARN_DATA_OUT_OF_RANGE
|
||||||
|
INSERT INTO t12u VALUES(0), (0), (0), (0), (-1), (-10), (0), (20), (30), (31);
|
||||||
|
INSERT INTO t12u VALUES(0), (0), (0), (0), (0), (20), (30), (31);
|
||||||
|
SELECT * FROM t12u;
|
||||||
|
|
||||||
--echo # Scenario 1: Normal restart, to test if the counters are persisted
|
--echo # Scenario 1: Normal restart, to test if the counters are persisted
|
||||||
--echo # Scenario 2: Delete some values, to test the counters should not be the
|
--echo # Scenario 2: Delete some values, to test the counters should not be the
|
||||||
--echo # one which is the largest in current table
|
--echo # one which is the largest in current table
|
||||||
@ -566,4 +576,5 @@ INSERT INTO t33 VALUES(3, NULL);
|
|||||||
SELECT MAX(b) AS `Expect 4` FROM t33;
|
SELECT MAX(b) AS `Expect 4` FROM t33;
|
||||||
SELECT * FROM t33;
|
SELECT * FROM t33;
|
||||||
|
|
||||||
DROP TABLE t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t30, t32, t33;
|
DROP TABLE t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t11u, t12u,
|
||||||
|
t30, t32, t33;
|
||||||
|
@ -5,6 +5,9 @@ id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
|
|||||||
title VARCHAR(200),
|
title VARCHAR(200),
|
||||||
content TEXT
|
content TEXT
|
||||||
) ENGINE= InnoDB;
|
) ENGINE= InnoDB;
|
||||||
|
SET STATEMENT debug_dbug='+d,innodb_report_deadlock' FOR
|
||||||
|
CREATE FULLTEXT INDEX idx ON articles (title, content);
|
||||||
|
ERROR HY000: Got error 11 "Resource temporarily unavailable" from storage engine InnoDB
|
||||||
CREATE FULLTEXT INDEX idx ON articles (title, content);
|
CREATE FULLTEXT INDEX idx ON articles (title, content);
|
||||||
INSERT INTO articles (title, content) VALUES
|
INSERT INTO articles (title, content) VALUES
|
||||||
('MySQL Tutorial','DBMS stands for MySQL DataBase ...'),
|
('MySQL Tutorial','DBMS stands for MySQL DataBase ...'),
|
||||||
|
@ -3,6 +3,9 @@
|
|||||||
|
|
||||||
-- source include/have_innodb.inc
|
-- source include/have_innodb.inc
|
||||||
-- source include/have_debug.inc
|
-- source include/have_debug.inc
|
||||||
|
--disable_query_log
|
||||||
|
call mtr.add_suppression("InnoDB: \\(Deadlock\\) writing `use_stopword'");
|
||||||
|
--enable_query_log
|
||||||
|
|
||||||
SET @optimize=@@GLOBAL.INNODB_OPTIMIZE_FULLTEXT_ONLY;
|
SET @optimize=@@GLOBAL.INNODB_OPTIMIZE_FULLTEXT_ONLY;
|
||||||
SET GLOBAL INNODB_OPTIMIZE_FULLTEXT_ONLY=1;
|
SET GLOBAL INNODB_OPTIMIZE_FULLTEXT_ONLY=1;
|
||||||
@ -14,6 +17,9 @@ CREATE TABLE articles (
|
|||||||
content TEXT
|
content TEXT
|
||||||
) ENGINE= InnoDB;
|
) ENGINE= InnoDB;
|
||||||
|
|
||||||
|
--error ER_GET_ERRNO
|
||||||
|
SET STATEMENT debug_dbug='+d,innodb_report_deadlock' FOR
|
||||||
|
CREATE FULLTEXT INDEX idx ON articles (title, content);
|
||||||
CREATE FULLTEXT INDEX idx ON articles (title, content);
|
CREATE FULLTEXT INDEX idx ON articles (title, content);
|
||||||
|
|
||||||
INSERT INTO articles (title, content) VALUES
|
INSERT INTO articles (title, content) VALUES
|
||||||
|
@ -1,16 +1,15 @@
|
|||||||
***MDEV-5914: Parallel replication deadlock due to InnoDB lock conflicts ***
|
***MDEV-5914: Parallel replication deadlock due to InnoDB lock conflicts ***
|
||||||
include/master-slave.inc
|
include/master-slave.inc
|
||||||
[connection master]
|
[connection master]
|
||||||
connection server_2;
|
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
|
||||||
SET sql_log_bin=0;
|
CALL mtr.add_suppression("InnoDB: Transaction was aborted due to ");
|
||||||
CALL mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends");
|
CALL mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends");
|
||||||
SET sql_log_bin=1;
|
connection server_2;
|
||||||
SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads;
|
SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads;
|
||||||
include/stop_slave.inc
|
include/stop_slave.inc
|
||||||
SET GLOBAL slave_parallel_threads=10;
|
SET GLOBAL slave_parallel_threads=10;
|
||||||
CHANGE MASTER TO master_use_gtid=slave_pos;
|
CHANGE MASTER TO master_use_gtid=slave_pos;
|
||||||
connection server_1;
|
connection server_1;
|
||||||
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
|
|
||||||
CREATE TABLE t4 (a INT PRIMARY KEY, b INT, KEY b_idx(b)) ENGINE=InnoDB;
|
CREATE TABLE t4 (a INT PRIMARY KEY, b INT, KEY b_idx(b)) ENGINE=InnoDB;
|
||||||
INSERT INTO t4 VALUES (1,NULL), (2,2), (3,NULL), (4,4), (5, NULL), (6, 6);
|
INSERT INTO t4 VALUES (1,NULL), (2,2), (3,NULL), (4,4), (5, NULL), (6, 6);
|
||||||
connect con1,127.0.0.1,root,,test,$SERVER_MYPORT_1,;
|
connect con1,127.0.0.1,root,,test,$SERVER_MYPORT_1,;
|
||||||
|
@ -5,21 +5,19 @@
|
|||||||
--source include/have_debug_sync.inc
|
--source include/have_debug_sync.inc
|
||||||
--source include/master-slave.inc
|
--source include/master-slave.inc
|
||||||
|
|
||||||
--disable_query_log
|
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
|
||||||
call mtr.add_suppression("InnoDB: Transaction was aborted due to ");
|
CALL mtr.add_suppression("InnoDB: Transaction was aborted due to ");
|
||||||
--enable_query_log
|
CALL mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends");
|
||||||
|
--save_master_pos
|
||||||
|
|
||||||
--connection server_2
|
--connection server_2
|
||||||
SET sql_log_bin=0;
|
--sync_with_master
|
||||||
CALL mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends");
|
|
||||||
SET sql_log_bin=1;
|
|
||||||
SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads;
|
SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads;
|
||||||
--source include/stop_slave.inc
|
--source include/stop_slave.inc
|
||||||
SET GLOBAL slave_parallel_threads=10;
|
SET GLOBAL slave_parallel_threads=10;
|
||||||
CHANGE MASTER TO master_use_gtid=slave_pos;
|
CHANGE MASTER TO master_use_gtid=slave_pos;
|
||||||
|
|
||||||
--connection server_1
|
--connection server_1
|
||||||
ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB;
|
|
||||||
CREATE TABLE t4 (a INT PRIMARY KEY, b INT, KEY b_idx(b)) ENGINE=InnoDB;
|
CREATE TABLE t4 (a INT PRIMARY KEY, b INT, KEY b_idx(b)) ENGINE=InnoDB;
|
||||||
INSERT INTO t4 VALUES (1,NULL), (2,2), (3,NULL), (4,4), (5, NULL), (6, 6);
|
INSERT INTO t4 VALUES (1,NULL), (2,2), (3,NULL), (4,4), (5, NULL), (6, 6);
|
||||||
--connect (con1,127.0.0.1,root,,test,$SERVER_MYPORT_1,)
|
--connect (con1,127.0.0.1,root,,test,$SERVER_MYPORT_1,)
|
||||||
|
@ -1870,18 +1870,6 @@ err:
|
|||||||
if (non_temp_tables_count)
|
if (non_temp_tables_count)
|
||||||
query_cache_invalidate3(thd, tables, 0);
|
query_cache_invalidate3(thd, tables, 0);
|
||||||
|
|
||||||
/*
|
|
||||||
We are always logging drop of temporary tables.
|
|
||||||
The reason is to handle the following case:
|
|
||||||
- Use statement based replication
|
|
||||||
- CREATE TEMPORARY TABLE foo (logged)
|
|
||||||
- set row based replication
|
|
||||||
- DROP TEMPORARY TABLE foo (needs to be logged)
|
|
||||||
This should be fixed so that we remember if creation of the
|
|
||||||
temporary table was logged and only log it if the creation was
|
|
||||||
logged.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (non_trans_tmp_table_deleted ||
|
if (non_trans_tmp_table_deleted ||
|
||||||
trans_tmp_table_deleted || non_tmp_table_deleted)
|
trans_tmp_table_deleted || non_tmp_table_deleted)
|
||||||
{
|
{
|
||||||
|
@ -3242,11 +3242,9 @@ void wsrep_to_isolation_end(THD *thd)
|
|||||||
|
|
||||||
@param requestor_ctx The MDL context of the requestor
|
@param requestor_ctx The MDL context of the requestor
|
||||||
@param ticket MDL ticket for the requested lock
|
@param ticket MDL ticket for the requested lock
|
||||||
|
@param key The key of the object (data) being protected
|
||||||
|
|
||||||
@retval TRUE Lock request can be granted
|
|
||||||
@retval FALSE Lock request cannot be granted
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx,
|
void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx,
|
||||||
const MDL_ticket *ticket,
|
const MDL_ticket *ticket,
|
||||||
const MDL_key *key)
|
const MDL_key *key)
|
||||||
@ -3328,16 +3326,21 @@ void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx,
|
|||||||
(granted_thd->system_thread != NON_SYSTEM_THREAD &&
|
(granted_thd->system_thread != NON_SYSTEM_THREAD &&
|
||||||
granted_thd->mdl_context.has_explicit_locks()))
|
granted_thd->mdl_context.has_explicit_locks()))
|
||||||
{
|
{
|
||||||
WSREP_DEBUG("BF thread waiting for FLUSH for %s",
|
WSREP_DEBUG("BF thread waiting for %s",
|
||||||
wsrep_thd_query(request_thd));
|
granted_thd->lex->sql_command == SQLCOM_FLUSH ? "FLUSH" : "BACKUP");
|
||||||
THD_STAGE_INFO(request_thd, stage_waiting_ddl);
|
|
||||||
ticket->wsrep_report(wsrep_debug);
|
ticket->wsrep_report(wsrep_debug);
|
||||||
|
|
||||||
if (granted_thd->current_backup_stage != BACKUP_FINISHED &&
|
if (granted_thd->current_backup_stage != BACKUP_FINISHED &&
|
||||||
wsrep_check_mode(WSREP_MODE_BF_MARIABACKUP))
|
wsrep_check_mode(WSREP_MODE_BF_MARIABACKUP))
|
||||||
{
|
{
|
||||||
wsrep_abort_thd(request_thd, granted_thd, 1);
|
wsrep_abort_thd(request_thd, granted_thd, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (granted_thd->lex->sql_command == SQLCOM_LOCK_TABLES)
|
||||||
|
{
|
||||||
|
WSREP_DEBUG("BF thread waiting for LOCK TABLES");
|
||||||
|
ticket->wsrep_report(wsrep_debug);
|
||||||
|
}
|
||||||
else if (request_thd->lex->sql_command == SQLCOM_DROP_TABLE)
|
else if (request_thd->lex->sql_command == SQLCOM_DROP_TABLE)
|
||||||
{
|
{
|
||||||
WSREP_DEBUG("DROP caused BF abort, conf %s for %s",
|
WSREP_DEBUG("DROP caused BF abort, conf %s for %s",
|
||||||
|
@ -3487,9 +3487,7 @@ dict_stats_fetch_from_ps(
|
|||||||
dict_table_t* table) /*!< in/out: table */
|
dict_table_t* table) /*!< in/out: table */
|
||||||
{
|
{
|
||||||
index_fetch_t index_fetch_arg;
|
index_fetch_t index_fetch_arg;
|
||||||
trx_t* trx;
|
|
||||||
pars_info_t* pinfo;
|
pars_info_t* pinfo;
|
||||||
dberr_t ret;
|
|
||||||
char db_utf8[MAX_DB_UTF8_LEN];
|
char db_utf8[MAX_DB_UTF8_LEN];
|
||||||
char table_utf8[MAX_TABLE_UTF8_LEN];
|
char table_utf8[MAX_TABLE_UTF8_LEN];
|
||||||
|
|
||||||
@ -3503,34 +3501,36 @@ dict_stats_fetch_from_ps(
|
|||||||
MDL_ticket *mdl_table = nullptr, *mdl_index = nullptr;
|
MDL_ticket *mdl_table = nullptr, *mdl_index = nullptr;
|
||||||
dict_table_t* table_stats = dict_table_open_on_name(
|
dict_table_t* table_stats = dict_table_open_on_name(
|
||||||
TABLE_STATS_NAME, false, DICT_ERR_IGNORE_NONE);
|
TABLE_STATS_NAME, false, DICT_ERR_IGNORE_NONE);
|
||||||
if (table_stats) {
|
if (!table_stats) {
|
||||||
dict_sys.freeze(SRW_LOCK_CALL);
|
return DB_STATS_DO_NOT_EXIST;
|
||||||
table_stats = dict_acquire_mdl_shared<false>(table_stats, thd,
|
|
||||||
&mdl_table);
|
|
||||||
dict_sys.unfreeze();
|
|
||||||
}
|
}
|
||||||
|
dict_table_t* index_stats = dict_table_open_on_name(
|
||||||
|
INDEX_STATS_NAME, false, DICT_ERR_IGNORE_NONE);
|
||||||
|
if (!index_stats) {
|
||||||
|
dict_table_close(table_stats);
|
||||||
|
return DB_STATS_DO_NOT_EXIST;
|
||||||
|
}
|
||||||
|
|
||||||
|
dict_sys.freeze(SRW_LOCK_CALL);
|
||||||
|
table_stats = dict_acquire_mdl_shared<false>(table_stats, thd,
|
||||||
|
&mdl_table);
|
||||||
if (!table_stats
|
if (!table_stats
|
||||||
|| strcmp(table_stats->name.m_name, TABLE_STATS_NAME)) {
|
|| strcmp(table_stats->name.m_name, TABLE_STATS_NAME)) {
|
||||||
release_and_exit:
|
release_and_exit:
|
||||||
if (table_stats) {
|
if (table_stats) {
|
||||||
dict_table_close(table_stats, false, thd, mdl_table);
|
dict_table_close(table_stats, true, thd, mdl_table);
|
||||||
}
|
}
|
||||||
|
if (index_stats) {
|
||||||
|
dict_table_close(index_stats, true, thd, mdl_index);
|
||||||
|
}
|
||||||
|
dict_sys.unfreeze();
|
||||||
return DB_STATS_DO_NOT_EXIST;
|
return DB_STATS_DO_NOT_EXIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
dict_table_t* index_stats = dict_table_open_on_name(
|
index_stats = dict_acquire_mdl_shared<false>(index_stats, thd,
|
||||||
INDEX_STATS_NAME, false, DICT_ERR_IGNORE_NONE);
|
&mdl_index);
|
||||||
if (index_stats) {
|
if (!index_stats
|
||||||
dict_sys.freeze(SRW_LOCK_CALL);
|
|| strcmp(index_stats->name.m_name, INDEX_STATS_NAME)) {
|
||||||
index_stats = dict_acquire_mdl_shared<false>(index_stats, thd,
|
|
||||||
&mdl_index);
|
|
||||||
dict_sys.unfreeze();
|
|
||||||
}
|
|
||||||
if (!index_stats) {
|
|
||||||
goto release_and_exit;
|
|
||||||
}
|
|
||||||
if (strcmp(index_stats->name.m_name, INDEX_STATS_NAME)) {
|
|
||||||
dict_table_close(index_stats, false, thd, mdl_index);
|
|
||||||
goto release_and_exit;
|
goto release_and_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3538,10 +3538,6 @@ release_and_exit:
|
|||||||
DEBUG_SYNC(thd, "dict_stats_mdl_acquired");
|
DEBUG_SYNC(thd, "dict_stats_mdl_acquired");
|
||||||
#endif /* ENABLED_DEBUG_SYNC */
|
#endif /* ENABLED_DEBUG_SYNC */
|
||||||
|
|
||||||
trx = trx_create();
|
|
||||||
|
|
||||||
trx_start_internal_read_only(trx);
|
|
||||||
|
|
||||||
dict_fs2utf8(table->name.m_name, db_utf8, sizeof(db_utf8),
|
dict_fs2utf8(table->name.m_name, db_utf8, sizeof(db_utf8),
|
||||||
table_utf8, sizeof(table_utf8));
|
table_utf8, sizeof(table_utf8));
|
||||||
|
|
||||||
@ -3562,76 +3558,85 @@ release_and_exit:
|
|||||||
"fetch_index_stats_step",
|
"fetch_index_stats_step",
|
||||||
dict_stats_fetch_index_stats_step,
|
dict_stats_fetch_index_stats_step,
|
||||||
&index_fetch_arg);
|
&index_fetch_arg);
|
||||||
dict_sys.lock(SRW_LOCK_CALL); /* FIXME: remove this */
|
dict_sys.unfreeze();
|
||||||
ret = que_eval_sql(pinfo,
|
dict_sys.lock(SRW_LOCK_CALL);
|
||||||
"PROCEDURE FETCH_STATS () IS\n"
|
que_t* graph = pars_sql(
|
||||||
"found INT;\n"
|
pinfo,
|
||||||
"DECLARE FUNCTION fetch_table_stats_step;\n"
|
"PROCEDURE FETCH_STATS () IS\n"
|
||||||
"DECLARE FUNCTION fetch_index_stats_step;\n"
|
"found INT;\n"
|
||||||
"DECLARE CURSOR table_stats_cur IS\n"
|
"DECLARE FUNCTION fetch_table_stats_step;\n"
|
||||||
" SELECT\n"
|
"DECLARE FUNCTION fetch_index_stats_step;\n"
|
||||||
/* if you change the selected fields, be
|
"DECLARE CURSOR table_stats_cur IS\n"
|
||||||
sure to adjust
|
" SELECT\n"
|
||||||
dict_stats_fetch_table_stats_step() */
|
/* if you change the selected fields, be
|
||||||
" n_rows,\n"
|
sure to adjust
|
||||||
" clustered_index_size,\n"
|
dict_stats_fetch_table_stats_step() */
|
||||||
" sum_of_other_index_sizes\n"
|
" n_rows,\n"
|
||||||
" FROM \"" TABLE_STATS_NAME "\"\n"
|
" clustered_index_size,\n"
|
||||||
" WHERE\n"
|
" sum_of_other_index_sizes\n"
|
||||||
" database_name = :database_name AND\n"
|
" FROM \"" TABLE_STATS_NAME "\"\n"
|
||||||
" table_name = :table_name;\n"
|
" WHERE\n"
|
||||||
"DECLARE CURSOR index_stats_cur IS\n"
|
" database_name = :database_name AND\n"
|
||||||
" SELECT\n"
|
" table_name = :table_name;\n"
|
||||||
/* if you change the selected fields, be
|
"DECLARE CURSOR index_stats_cur IS\n"
|
||||||
sure to adjust
|
" SELECT\n"
|
||||||
dict_stats_fetch_index_stats_step() */
|
/* if you change the selected fields, be
|
||||||
" index_name,\n"
|
sure to adjust
|
||||||
" stat_name,\n"
|
dict_stats_fetch_index_stats_step() */
|
||||||
" stat_value,\n"
|
" index_name,\n"
|
||||||
" sample_size\n"
|
" stat_name,\n"
|
||||||
" FROM \"" INDEX_STATS_NAME "\"\n"
|
" stat_value,\n"
|
||||||
" WHERE\n"
|
" sample_size\n"
|
||||||
" database_name = :database_name AND\n"
|
" FROM \"" INDEX_STATS_NAME "\"\n"
|
||||||
" table_name = :table_name;\n"
|
" WHERE\n"
|
||||||
|
" database_name = :database_name AND\n"
|
||||||
|
" table_name = :table_name;\n"
|
||||||
|
|
||||||
"BEGIN\n"
|
"BEGIN\n"
|
||||||
|
|
||||||
"OPEN table_stats_cur;\n"
|
"OPEN table_stats_cur;\n"
|
||||||
"FETCH table_stats_cur INTO\n"
|
"FETCH table_stats_cur INTO\n"
|
||||||
" fetch_table_stats_step();\n"
|
" fetch_table_stats_step();\n"
|
||||||
"IF (SQL % NOTFOUND) THEN\n"
|
"IF (SQL % NOTFOUND) THEN\n"
|
||||||
" CLOSE table_stats_cur;\n"
|
" CLOSE table_stats_cur;\n"
|
||||||
" RETURN;\n"
|
" RETURN;\n"
|
||||||
"END IF;\n"
|
"END IF;\n"
|
||||||
"CLOSE table_stats_cur;\n"
|
"CLOSE table_stats_cur;\n"
|
||||||
|
|
||||||
"OPEN index_stats_cur;\n"
|
"OPEN index_stats_cur;\n"
|
||||||
"found := 1;\n"
|
"found := 1;\n"
|
||||||
"WHILE found = 1 LOOP\n"
|
"WHILE found = 1 LOOP\n"
|
||||||
" FETCH index_stats_cur INTO\n"
|
" FETCH index_stats_cur INTO\n"
|
||||||
" fetch_index_stats_step();\n"
|
" fetch_index_stats_step();\n"
|
||||||
" IF (SQL % NOTFOUND) THEN\n"
|
" IF (SQL % NOTFOUND) THEN\n"
|
||||||
" found := 0;\n"
|
" found := 0;\n"
|
||||||
" END IF;\n"
|
" END IF;\n"
|
||||||
"END LOOP;\n"
|
"END LOOP;\n"
|
||||||
"CLOSE index_stats_cur;\n"
|
"CLOSE index_stats_cur;\n"
|
||||||
|
|
||||||
"END;", trx);
|
"END;");
|
||||||
/* pinfo is freed by que_eval_sql() */
|
|
||||||
dict_sys.unlock();
|
dict_sys.unlock();
|
||||||
|
|
||||||
|
trx_t* trx = trx_create();
|
||||||
|
trx->graph = nullptr;
|
||||||
|
graph->trx = trx;
|
||||||
|
|
||||||
|
trx_start_internal_read_only(trx);
|
||||||
|
que_run_threads(que_fork_start_command(graph));
|
||||||
|
que_graph_free(graph);
|
||||||
|
|
||||||
dict_table_close(table_stats, false, thd, mdl_table);
|
dict_table_close(table_stats, false, thd, mdl_table);
|
||||||
dict_table_close(index_stats, false, thd, mdl_index);
|
dict_table_close(index_stats, false, thd, mdl_index);
|
||||||
|
|
||||||
trx_commit_for_mysql(trx);
|
trx_commit_for_mysql(trx);
|
||||||
|
dberr_t ret = trx->error_state;
|
||||||
trx->free();
|
trx->free();
|
||||||
|
|
||||||
if (!index_fetch_arg.stats_were_modified) {
|
if (!index_fetch_arg.stats_were_modified) {
|
||||||
return(DB_STATS_DO_NOT_EXIST);
|
return DB_STATS_DO_NOT_EXIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
return(ret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************//**
|
/*********************************************************************//**
|
||||||
|
@ -231,7 +231,7 @@ fts_config_set_value(
|
|||||||
n_rows_updated = trx->undo_no - undo_no;
|
n_rows_updated = trx->undo_no - undo_no;
|
||||||
|
|
||||||
/* Check if we need to do an insert. */
|
/* Check if we need to do an insert. */
|
||||||
if (n_rows_updated == 0) {
|
if (error == DB_SUCCESS && n_rows_updated == 0) {
|
||||||
info = pars_info_create();
|
info = pars_info_create();
|
||||||
|
|
||||||
pars_info_bind_varchar_literal(
|
pars_info_bind_varchar_literal(
|
||||||
|
@ -37,6 +37,7 @@ Full Text Search interface
|
|||||||
#include "fts0plugin.h"
|
#include "fts0plugin.h"
|
||||||
#include "dict0stats.h"
|
#include "dict0stats.h"
|
||||||
#include "btr0pcur.h"
|
#include "btr0pcur.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
static const ulint FTS_MAX_ID_LEN = 32;
|
static const ulint FTS_MAX_ID_LEN = 32;
|
||||||
|
|
||||||
@ -1870,8 +1871,10 @@ fts_create_one_common_table(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ib::warn() << "Failed to create FTS common table " << fts_table_name;
|
ut_ad(trx->state == TRX_STATE_NOT_STARTED
|
||||||
trx->error_state = error;
|
|| trx->error_state == error);
|
||||||
|
sql_print_warning("InnoDB: Failed to create FTS common table %s: %s",
|
||||||
|
fts_table_name, ut_strerr(error));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2055,8 +2058,10 @@ fts_create_one_index_table(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ib::warn() << "Failed to create FTS index table " << table_name;
|
ut_ad(trx->state == TRX_STATE_NOT_STARTED
|
||||||
trx->error_state = error;
|
|| trx->error_state == error);
|
||||||
|
sql_print_warning("InnoDB: Failed to create FTS index table %s: %s",
|
||||||
|
table_name, ut_strerr(error));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -328,22 +328,6 @@ row_get_clust_rec(
|
|||||||
mtr_t* mtr) /*!< in: mtr */
|
mtr_t* mtr) /*!< in: mtr */
|
||||||
MY_ATTRIBUTE((nonnull, warn_unused_result));
|
MY_ATTRIBUTE((nonnull, warn_unused_result));
|
||||||
|
|
||||||
/** Parse the integer data from specified data, which could be
|
|
||||||
DATA_INT, DATA_FLOAT or DATA_DOUBLE. If the value is less than 0
|
|
||||||
and the type is not unsigned then we reset the value to 0
|
|
||||||
@param[in] data data to read
|
|
||||||
@param[in] len length of data
|
|
||||||
@param[in] mtype mtype of data
|
|
||||||
@param[in] unsigned_type if the data is unsigned
|
|
||||||
@return the integer value from the data */
|
|
||||||
inline
|
|
||||||
ib_uint64_t
|
|
||||||
row_parse_int(
|
|
||||||
const byte* data,
|
|
||||||
ulint len,
|
|
||||||
ulint mtype,
|
|
||||||
bool unsigned_type);
|
|
||||||
|
|
||||||
/** Result of row_search_index_entry */
|
/** Result of row_search_index_entry */
|
||||||
enum row_search_result {
|
enum row_search_result {
|
||||||
ROW_FOUND = 0, /*!< the record was found */
|
ROW_FOUND = 0, /*!< the record was found */
|
||||||
|
@ -170,52 +170,3 @@ row_build_row_ref_fast(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Parse the integer data from specified data, which could be
|
|
||||||
DATA_INT, DATA_FLOAT or DATA_DOUBLE. If the value is less than 0
|
|
||||||
and the type is not unsigned then we reset the value to 0
|
|
||||||
@param[in] data data to read
|
|
||||||
@param[in] len length of data
|
|
||||||
@param[in] mtype mtype of data
|
|
||||||
@param[in] unsigned_type if the data is unsigned
|
|
||||||
@return the integer value from the data */
|
|
||||||
ib_uint64_t
|
|
||||||
row_parse_int(
|
|
||||||
const byte* data,
|
|
||||||
ulint len,
|
|
||||||
ulint mtype,
|
|
||||||
bool unsigned_type)
|
|
||||||
{
|
|
||||||
ib_uint64_t value = 0;
|
|
||||||
|
|
||||||
switch (mtype) {
|
|
||||||
case DATA_INT:
|
|
||||||
|
|
||||||
ut_a(len <= sizeof value);
|
|
||||||
value = mach_read_int_type(data, len, unsigned_type);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DATA_FLOAT:
|
|
||||||
|
|
||||||
ut_a(len == sizeof(float));
|
|
||||||
value = static_cast<ib_uint64_t>(mach_float_read(data));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DATA_DOUBLE:
|
|
||||||
|
|
||||||
ut_a(len == sizeof(double));
|
|
||||||
value = static_cast<ib_uint64_t>(mach_double_read(data));
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
ut_error;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!unsigned_type && static_cast<int64_t>(value) < 0) {
|
|
||||||
value = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -182,9 +182,8 @@ dberr_t row_check_index(row_prebuilt_t *prebuilt, ulint *n_rows)
|
|||||||
@param[in] index index starting with an AUTO_INCREMENT column
|
@param[in] index index starting with an AUTO_INCREMENT column
|
||||||
@return the largest AUTO_INCREMENT value
|
@return the largest AUTO_INCREMENT value
|
||||||
@retval 0 if no records were found */
|
@retval 0 if no records were found */
|
||||||
ib_uint64_t
|
uint64_t row_search_max_autoinc(dict_index_t *index) noexcept
|
||||||
row_search_max_autoinc(dict_index_t* index)
|
MY_ATTRIBUTE((nonnull, warn_unused_result));
|
||||||
MY_ATTRIBUTE((nonnull, warn_unused_result));
|
|
||||||
|
|
||||||
/** A structure for caching column values for prefetched rows */
|
/** A structure for caching column values for prefetched rows */
|
||||||
struct sel_buf_t{
|
struct sel_buf_t{
|
||||||
|
@ -783,11 +783,6 @@ pars_retrieve_table_list_defs(
|
|||||||
{
|
{
|
||||||
ulint count = 0;
|
ulint count = 0;
|
||||||
|
|
||||||
if (sym_node == NULL) {
|
|
||||||
|
|
||||||
return(count);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (sym_node) {
|
while (sym_node) {
|
||||||
pars_retrieve_table_def(sym_node);
|
pars_retrieve_table_def(sym_node);
|
||||||
|
|
||||||
|
@ -2580,12 +2580,44 @@ static bool thd_sql_is_insert(const THD *thd) noexcept
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined __aarch64__&&defined __GNUC__&&__GNUC__==4&&!defined __clang__
|
/** Parse the integer data from specified data, which could be
|
||||||
/* Avoid GCC 4.8.5 internal compiler error due to srw_mutex::wr_unlock().
|
DATA_INT, DATA_FLOAT or DATA_DOUBLE. If the value is less than 0
|
||||||
We would only need this for row_ins_clust_index_entry_low(),
|
and the type is not unsigned then we reset the value to 0
|
||||||
but GCC 4.8.5 does not support pop_options. */
|
@param data data to read
|
||||||
# pragma GCC optimize ("O0")
|
@param len length of data
|
||||||
#endif
|
@param mtype main type of the column
|
||||||
|
@param prtype precise type of the column
|
||||||
|
@return the integer value from the data
|
||||||
|
@retval 0 if the value is negative or the type or length invalid */
|
||||||
|
static uint64_t row_parse_int(const byte *data, size_t len,
|
||||||
|
ulint mtype, ulint prtype) noexcept
|
||||||
|
{
|
||||||
|
switch (mtype) {
|
||||||
|
case DATA_FLOAT:
|
||||||
|
if (len != sizeof(float))
|
||||||
|
return 0;
|
||||||
|
{
|
||||||
|
float f= mach_float_read(data);
|
||||||
|
return f <= 0.0 ? 0 : uint64_t(f);
|
||||||
|
}
|
||||||
|
case DATA_DOUBLE:
|
||||||
|
if (len != sizeof(double))
|
||||||
|
return 0;
|
||||||
|
{
|
||||||
|
double d= mach_double_read(data);
|
||||||
|
return d <= 0.0 ? 0 : uint64_t(d);
|
||||||
|
}
|
||||||
|
case DATA_INT:
|
||||||
|
if (len == 0 || len > 8)
|
||||||
|
return 0;
|
||||||
|
const ibool unsigned_type{prtype & DATA_UNSIGNED};
|
||||||
|
uint64_t value= mach_read_int_type(data, len, unsigned_type);
|
||||||
|
return !unsigned_type && int64_t(value) < 0 ? 0 : value;
|
||||||
|
}
|
||||||
|
|
||||||
|
ut_ad("invalid type" == 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************************************//**
|
/***************************************************************//**
|
||||||
Tries to insert an entry into a clustered index, ignoring foreign key
|
Tries to insert an entry into a clustered index, ignoring foreign key
|
||||||
@ -2672,8 +2704,7 @@ row_ins_clust_index_entry_low(
|
|||||||
dfield->data),
|
dfield->data),
|
||||||
dfield->len,
|
dfield->len,
|
||||||
dfield->type.mtype,
|
dfield->type.mtype,
|
||||||
dfield->type.prtype
|
dfield->type.prtype);
|
||||||
& DATA_UNSIGNED);
|
|
||||||
if (auto_inc
|
if (auto_inc
|
||||||
&& mode != BTR_MODIFY_TREE) {
|
&& mode != BTR_MODIFY_TREE) {
|
||||||
mode = btr_latch_mode(
|
mode = btr_latch_mode(
|
||||||
@ -3891,3 +3922,79 @@ error_handling:
|
|||||||
|
|
||||||
return(thr);
|
return(thr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Read the AUTOINC column from an index record
|
||||||
|
@param index index of the record
|
||||||
|
@param rec the record
|
||||||
|
@return value read from the first column
|
||||||
|
@retval 0 if the value would be NULL or negative */
|
||||||
|
static uint64_t row_read_autoinc(const dict_index_t &index, const rec_t *rec)
|
||||||
|
noexcept
|
||||||
|
{
|
||||||
|
const dict_field_t &field= index.fields[0];
|
||||||
|
ut_ad(!DATA_BIG_COL(field.col));
|
||||||
|
ut_ad(!(rec_get_info_bits(rec, index.table->not_redundant()) &
|
||||||
|
(REC_INFO_MIN_REC_FLAG | REC_INFO_DELETED_FLAG)));
|
||||||
|
mem_heap_t *heap= nullptr;
|
||||||
|
rec_offs offsets_[REC_OFFS_HEADER_SIZE + 2];
|
||||||
|
rec_offs_init(offsets_);
|
||||||
|
rec_offs *offsets= rec_get_offsets(rec, &index, offsets_,
|
||||||
|
index.n_core_fields, 1, &heap);
|
||||||
|
ut_ad(!heap);
|
||||||
|
|
||||||
|
size_t len;
|
||||||
|
ut_d(size_t first_offset=) rec_get_nth_field_offs(offsets, 0, &len);
|
||||||
|
ut_ad(!first_offset);
|
||||||
|
return row_parse_int(rec, len, field.col->mtype, field.col->prtype);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get the maximum and non-delete-marked record in an index.
|
||||||
|
@param index index B-tree
|
||||||
|
@param mtr mini-transaction (may be committed and restarted)
|
||||||
|
@return maximum record, page s-latched in mtr
|
||||||
|
@retval nullptr if there are no records, or if all of them are delete-marked */
|
||||||
|
static
|
||||||
|
const rec_t *row_search_get_max_rec(dict_index_t *index, mtr_t *mtr) noexcept
|
||||||
|
{
|
||||||
|
btr_pcur_t pcur;
|
||||||
|
const bool desc= index->fields[0].descending;
|
||||||
|
|
||||||
|
/* Open at the high/right end (false), and init cursor */
|
||||||
|
if (pcur.open_leaf(desc, index, BTR_SEARCH_LEAF, mtr) != DB_SUCCESS)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
if (desc)
|
||||||
|
{
|
||||||
|
const bool comp= index->table->not_redundant();
|
||||||
|
while (btr_pcur_move_to_next_user_rec(&pcur, mtr))
|
||||||
|
{
|
||||||
|
const rec_t *rec= btr_pcur_get_rec(&pcur);
|
||||||
|
if (!rec_is_metadata(rec, comp) && !rec_get_deleted_flag(rec, comp))
|
||||||
|
return rec;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
const page_t *page= btr_pcur_get_page(&pcur);
|
||||||
|
const rec_t *rec= page_find_rec_last_not_deleted(page);
|
||||||
|
if (page_rec_is_user_rec_low(rec - page))
|
||||||
|
return rec;
|
||||||
|
btr_pcur_move_before_first_on_page(&pcur);
|
||||||
|
}
|
||||||
|
while (btr_pcur_move_to_prev(&pcur, mtr));
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t row_search_max_autoinc(dict_index_t *index) noexcept
|
||||||
|
{
|
||||||
|
uint64_t value= 0;
|
||||||
|
mtr_t mtr;
|
||||||
|
mtr.start();
|
||||||
|
if (const rec_t *rec= row_search_get_max_rec(index, &mtr))
|
||||||
|
value= row_read_autoinc(*index, rec);
|
||||||
|
mtr.commit();
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
@ -2159,11 +2159,9 @@ row_create_index_for_mysql(
|
|||||||
|
|
||||||
index = node->index;
|
index = node->index;
|
||||||
|
|
||||||
ut_ad(!index == (err != DB_SUCCESS));
|
|
||||||
|
|
||||||
que_graph_free((que_t*) que_node_get_parent(thr));
|
que_graph_free((que_t*) que_node_get_parent(thr));
|
||||||
|
|
||||||
if (index && (index->type & DICT_FTS)) {
|
if (err == DB_SUCCESS && (index->type & DICT_FTS)) {
|
||||||
err = fts_create_index_tables(trx, index, table->id);
|
err = fts_create_index_tables(trx, index, table->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6852,123 +6852,3 @@ next_rec:
|
|||||||
|
|
||||||
goto rec_loop;
|
goto rec_loop;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************//**
|
|
||||||
Read the AUTOINC column from the current row. If the value is less than
|
|
||||||
0 and the type is not unsigned then we reset the value to 0.
|
|
||||||
@return value read from the column */
|
|
||||||
static
|
|
||||||
ib_uint64_t
|
|
||||||
row_search_autoinc_read_column(
|
|
||||||
/*===========================*/
|
|
||||||
dict_index_t* index, /*!< in: index to read from */
|
|
||||||
const rec_t* rec, /*!< in: current rec */
|
|
||||||
ulint col_no, /*!< in: column number */
|
|
||||||
ulint mtype, /*!< in: column main type */
|
|
||||||
ibool unsigned_type) /*!< in: signed or unsigned flag */
|
|
||||||
{
|
|
||||||
ulint len;
|
|
||||||
const byte* data;
|
|
||||||
ib_uint64_t value;
|
|
||||||
mem_heap_t* heap = NULL;
|
|
||||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
|
||||||
rec_offs* offsets = offsets_;
|
|
||||||
|
|
||||||
rec_offs_init(offsets_);
|
|
||||||
ut_ad(page_rec_is_leaf(rec));
|
|
||||||
|
|
||||||
offsets = rec_get_offsets(rec, index, offsets, index->n_core_fields,
|
|
||||||
col_no + 1, &heap);
|
|
||||||
|
|
||||||
if (rec_offs_nth_sql_null(offsets, col_no)) {
|
|
||||||
/* There is no non-NULL value in the auto-increment column. */
|
|
||||||
value = 0;
|
|
||||||
goto func_exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
data = rec_get_nth_field(rec, offsets, col_no, &len);
|
|
||||||
|
|
||||||
value = row_parse_int(data, len, mtype, unsigned_type);
|
|
||||||
|
|
||||||
func_exit:
|
|
||||||
if (UNIV_LIKELY_NULL(heap)) {
|
|
||||||
mem_heap_free(heap);
|
|
||||||
}
|
|
||||||
|
|
||||||
return(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Get the maximum and non-delete-marked record in an index.
|
|
||||||
@param[in] index index tree
|
|
||||||
@param[in,out] mtr mini-transaction (may be committed and restarted)
|
|
||||||
@return maximum record, page s-latched in mtr
|
|
||||||
@retval NULL if there are no records, or if all of them are delete-marked */
|
|
||||||
static
|
|
||||||
const rec_t*
|
|
||||||
row_search_get_max_rec(
|
|
||||||
dict_index_t* index,
|
|
||||||
mtr_t* mtr)
|
|
||||||
{
|
|
||||||
btr_pcur_t pcur;
|
|
||||||
const rec_t* rec;
|
|
||||||
const bool desc = index->fields[0].descending;
|
|
||||||
|
|
||||||
if (pcur.open_leaf(desc, index, BTR_SEARCH_LEAF, mtr) != DB_SUCCESS) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (desc) {
|
|
||||||
const bool comp = index->table->not_redundant();
|
|
||||||
while (btr_pcur_move_to_next_user_rec(&pcur, mtr)) {
|
|
||||||
rec = btr_pcur_get_rec(&pcur);
|
|
||||||
if (rec_is_metadata(rec, *index)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!rec_get_deleted_flag(rec, comp)) {
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
do {
|
|
||||||
rec = page_find_rec_last_not_deleted(
|
|
||||||
btr_pcur_get_page(&pcur));
|
|
||||||
if (page_rec_is_user_rec(rec)) {
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
btr_pcur_move_before_first_on_page(&pcur);
|
|
||||||
} while (btr_pcur_move_to_prev(&pcur, mtr));
|
|
||||||
}
|
|
||||||
|
|
||||||
rec = nullptr;
|
|
||||||
|
|
||||||
found:
|
|
||||||
ut_ad(!rec
|
|
||||||
|| !(rec_get_info_bits(rec, dict_table_is_comp(index->table))
|
|
||||||
& (REC_INFO_MIN_REC_FLAG | REC_INFO_DELETED_FLAG)));
|
|
||||||
return(rec);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Read the max AUTOINC value from an index.
|
|
||||||
@param[in] index index starting with an AUTO_INCREMENT column
|
|
||||||
@return the largest AUTO_INCREMENT value
|
|
||||||
@retval 0 if no records were found */
|
|
||||||
ib_uint64_t
|
|
||||||
row_search_max_autoinc(dict_index_t* index)
|
|
||||||
{
|
|
||||||
const dict_field_t* dfield = dict_index_get_nth_field(index, 0);
|
|
||||||
|
|
||||||
ib_uint64_t value = 0;
|
|
||||||
|
|
||||||
mtr_t mtr;
|
|
||||||
mtr.start();
|
|
||||||
|
|
||||||
if (const rec_t* rec = row_search_get_max_rec(index, &mtr)) {
|
|
||||||
value = row_search_autoinc_read_column(
|
|
||||||
index, rec, 0,
|
|
||||||
dfield->col->mtype,
|
|
||||||
dfield->col->prtype & DATA_UNSIGNED);
|
|
||||||
}
|
|
||||||
|
|
||||||
mtr.commit();
|
|
||||||
return(value);
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user