Merge 10.4 into 10.5

This commit is contained in:
Marko Mäkelä 2024-02-12 11:38:13 +02:00
commit 8ec12e0d6d
87 changed files with 1677 additions and 477 deletions

@ -1 +1 @@
Subproject commit 66596ad9e1d7efa8479656872cf09c9c1870a02e Subproject commit 3b3c175af0e993ffaae251871421e206cc41963f

@ -1 +1 @@
Subproject commit 9155b19b462ac15fc69d0b58ae51370b7523ced5 Subproject commit ae565eea90dd3053a5a7857e7cdad93342dbc645

View File

@ -12,7 +12,6 @@ INSERT INTO t1 VALUES (1,REPEAT('a',100)),(2,REPEAT('v',200)),(3,REPEAT('r',300)
INSERT INTO t1 VALUES (5,REPEAT('k',500)),(6,'April'),(7,7),(8,""),(9,"M"),(10,DEFAULT); INSERT INTO t1 VALUES (5,REPEAT('k',500)),(6,'April'),(7,7),(8,""),(9,"M"),(10,DEFAULT);
ALTER TABLE t1 ANALYZE PARTITION p1; ALTER TABLE t1 ANALYZE PARTITION p1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
ALTER TABLE t1 CHECK PARTITION p2; ALTER TABLE t1 CHECK PARTITION p2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text

View File

@ -4215,4 +4215,38 @@ a
drop table t1, t2; drop table t1, t2;
drop view v1; drop view v1;
drop procedure aproc; drop procedure aproc;
#
# MDEV-31305: Aggregation over materialized derived table
#
CREATE VIEW v AS
SELECT seq1.seq AS dim1, seq2.seq AS dim2, seq3.seq AS dim3,
FLOOR(RAND(13) * 5) AS p
FROM seq_100_to_105 seq1
JOIN seq_10_to_15 seq2
JOIN seq_1_to_5 seq3;
SELECT v.*, SUM(p) from v;
dim1 dim2 dim3 p SUM(p)
100 10 1 2 371
SELECT d.*, SUM(p)
FROM (
SELECT seq1.seq AS dim1, seq2.seq AS dim2, seq3.seq AS dim3,
FLOOR(RAND(13) * 5) AS p
FROM seq_100_to_105 seq1
JOIN seq_10_to_15 seq2
JOIN seq_1_to_5 seq3
) d;
dim1 dim2 dim3 p SUM(p)
100 10 1 2 371
WITH demo AS
(
SELECT seq1.seq AS dim1, seq2.seq AS dim2, seq3.seq AS dim3,
FLOOR(RAND(13) * 5) AS p
FROM seq_100_to_105 seq1
JOIN seq_10_to_15 seq2
JOIN seq_1_to_5 seq3
)
SELECT d.*, SUM(p) FROM demo d;
dim1 dim2 dim3 p SUM(p)
100 10 1 2 371
DROP VIEW v;
# End of 10.4 tests # End of 10.4 tests

View File

@ -2795,4 +2795,40 @@ drop table t1, t2;
drop view v1; drop view v1;
drop procedure aproc; drop procedure aproc;
--echo #
--echo # MDEV-31305: Aggregation over materialized derived table
--echo #
--source include/have_sequence.inc
CREATE VIEW v AS
SELECT seq1.seq AS dim1, seq2.seq AS dim2, seq3.seq AS dim3,
FLOOR(RAND(13) * 5) AS p
FROM seq_100_to_105 seq1
JOIN seq_10_to_15 seq2
JOIN seq_1_to_5 seq3;
SELECT v.*, SUM(p) from v;
SELECT d.*, SUM(p)
FROM (
SELECT seq1.seq AS dim1, seq2.seq AS dim2, seq3.seq AS dim3,
FLOOR(RAND(13) * 5) AS p
FROM seq_100_to_105 seq1
JOIN seq_10_to_15 seq2
JOIN seq_1_to_5 seq3
) d;
WITH demo AS
(
SELECT seq1.seq AS dim1, seq2.seq AS dim2, seq3.seq AS dim3,
FLOOR(RAND(13) * 5) AS p
FROM seq_100_to_105 seq1
JOIN seq_10_to_15 seq2
JOIN seq_1_to_5 seq3
)
SELECT d.*, SUM(p) FROM demo d;
DROP VIEW v;
--echo # End of 10.4 tests --echo # End of 10.4 tests

0
mysql-test/main/lowercase_table2.result Executable file → Normal file
View File

View File

@ -9028,6 +9028,25 @@ JS
drop table t1,t2,t3,t10,t11; drop table t1,t2,t3,t10,t11;
set optimizer_trace=DEFAULT; set optimizer_trace=DEFAULT;
# #
# MDEV-29179 Condition pushdown from HAVING into WHERE is not shown in optimizer trace
#
CREATE TABLE t1 (a INT, b VARCHAR(1), KEY (a), KEY(b,a)) ENGINE=MEMORY;
INSERT INTO t1 VALUES (4,'n'),(1,'h'),(NULL,'w');
SET optimizer_trace= 'enabled=on';
SELECT b, a FROM t1 WHERE b <> 'p' OR a = 4 GROUP BY b, a HAVING a <= 7;
b a
h 1
n 4
SELECT json_detailed(json_extract(trace, '$**.steps[*].join_optimization.steps[*].condition_pushdown_from_having') ), JSON_VALID(trace) FROM information_schema.optimizer_trace;
json_detailed(json_extract(trace, '$**.steps[*].join_optimization.steps[*].condition_pushdown_from_having') ) JSON_VALID(trace)
[
{
"conds": "(t1.b <> 'p' or multiple equal(4, t1.a)) and t1.a <= 7",
"having": null
}
] 1
DROP TABLE t1;
#
# End of 10.4 tests # End of 10.4 tests
# #
set optimizer_trace='enabled=on'; set optimizer_trace='enabled=on';

View File

@ -790,6 +790,17 @@ from information_schema.optimizer_trace;
drop table t1,t2,t3,t10,t11; drop table t1,t2,t3,t10,t11;
set optimizer_trace=DEFAULT; set optimizer_trace=DEFAULT;
--echo #
--echo # MDEV-29179 Condition pushdown from HAVING into WHERE is not shown in optimizer trace
--echo #
CREATE TABLE t1 (a INT, b VARCHAR(1), KEY (a), KEY(b,a)) ENGINE=MEMORY;
INSERT INTO t1 VALUES (4,'n'),(1,'h'),(NULL,'w');
SET optimizer_trace= 'enabled=on';
SELECT b, a FROM t1 WHERE b <> 'p' OR a = 4 GROUP BY b, a HAVING a <= 7;
SELECT json_detailed(json_extract(trace, '$**.steps[*].join_optimization.steps[*].condition_pushdown_from_having') ), JSON_VALID(trace) FROM information_schema.optimizer_trace;
DROP TABLE t1;
--echo # --echo #
--echo # End of 10.4 tests --echo # End of 10.4 tests
--echo # --echo #

View File

@ -2063,7 +2063,6 @@ ALTER TABLE t1 ANALYZE PARTITION p1 EXTENDED;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'EXTENDED' at line 1 ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'EXTENDED' at line 1
ALTER TABLE t1 ANALYZE PARTITION p1; ALTER TABLE t1 ANALYZE PARTITION p1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
ALTER TABLE t1 CHECK PARTITION p1; ALTER TABLE t1 CHECK PARTITION p1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text

View File

@ -27,7 +27,6 @@ Table Op Msg_type Msg_text
test.t1 repair error Error in list of partitions to test.t1 test.t1 repair error Error in list of partitions to test.t1
ALTER TABLE t1 ANALYZE PARTITION p0; ALTER TABLE t1 ANALYZE PARTITION p0;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
ALTER TABLE t1 CHECK PARTITION p0; ALTER TABLE t1 CHECK PARTITION p0;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text

View File

@ -5811,5 +5811,123 @@ GROUP_CONCAT(@x)
0 0
DROP TABLE t; DROP TABLE t;
# #
# MDEV-15703: Crash in EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING DEFAULT
#
PREPARE stmt FROM 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)';
EXECUTE stmt USING DEFAULT;
ERROR HY000: Default/ignore value is not supported for such parameter usage
DEALLOCATE PREPARE stmt;
PREPARE stmt FROM 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)';
EXECUTE stmt USING IGNORE;
ERROR HY000: Default/ignore value is not supported for such parameter usage
DEALLOCATE PREPARE stmt;
EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING DEFAULT;
ERROR HY000: Default/ignore value is not supported for such parameter usage
EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING IGNORE;
ERROR HY000: Default/ignore value is not supported for such parameter usage
EXECUTE IMMEDIATE 'BEGIN NOT ATOMIC DECLARE a INT DEFAULT ?; END' USING DEFAULT;
ERROR HY000: Default/ignore value is not supported for such parameter usage
EXECUTE IMMEDIATE 'BEGIN NOT ATOMIC DECLARE a INT DEFAULT ?; END' USING IGNORE;
ERROR HY000: Default/ignore value is not supported for such parameter usage
CREATE PROCEDURE p1(a INT) SELECT 1;
EXECUTE IMMEDIATE 'CALL p1(?)' USING DEFAULT;
ERROR HY000: Default/ignore value is not supported for such parameter usage
EXECUTE IMMEDIATE 'CALL p1(?)' USING IGNORE;
ERROR HY000: Default/ignore value is not supported for such parameter usage
DROP PROCEDURE p1;
EXECUTE IMMEDIATE 'SELECT ? UNION SELECT 1' USING DEFAULT;
ERROR HY000: Default/ignore value is not supported for such parameter usage
EXECUTE IMMEDIATE 'SELECT ? UNION SELECT 1' USING IGNORE;
ERROR HY000: Default/ignore value is not supported for such parameter usage
EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION ALL SELECT 1) AS derived' USING DEFAULT;
ERROR HY000: Default/ignore value is not supported for such parameter usage
EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION ALL SELECT 1) AS derived' USING IGNORE;
ERROR HY000: Default/ignore value is not supported for such parameter usage
EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION DISTINCT SELECT 1) AS derived' USING DEFAULT;
ERROR HY000: Default/ignore value is not supported for such parameter usage
EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION DISTINCT SELECT 1) AS derived' USING IGNORE;
ERROR HY000: Default/ignore value is not supported for such parameter usage
# multi-update and DEFAULT
CREATE TABLE t1 (a INT, b INT DEFAULT a);
INSERT into t1 VALUES (1,2),(2,3);
CREATE TABLE t2 (a INT, b INT DEFAULT a);
INSERT INTO t2 VALUES (1,10),(2,30);
UPDATE t1,t2 SET t1.b = DEFAULT, t2.b = DEFAULT WHERE t1.a=t2.a;
SELECT * FROM t1;
a b
1 1
2 2
SELECT * FROM t2;
a b
1 1
2 2
# re-check the case for Prepared Statement with parameters
TRUNCATE TABLE t1;
TRUNCATE TABLE t2;
INSERT INTO t1 VALUES (1,2),(2,3);
INSERT INTO t2 VALUES (1,10),(2,30);
EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING DEFAULT, DEFAULT;
SELECT * FROM t1;
a b
1 1
2 2
SELECT * FROM t2;
a b
1 1
2 2
DROP TABLE t1, t2;
# multi-update and IGNORE
CREATE TABLE t1 (a INT, b INT default a);
INSERT INTO t1 VALUES (1,2),(2,3);
CREATE TABLE t2 (a INT, b INT default a);
INSERT INTO t2 VALUES (1,10),(2,30);
UPDATE t1,t2 SET t1.b = IGNORE, t2.b = IGNORE WHERE t1.a=t2.a;
SELECT * FROM t1;
a b
1 2
2 3
SELECT * FROM t2;
a b
1 NULL
2 NULL
# re-check the case for Prepared Statement with parameters
TRUNCATE TABLE t1;
TRUNCATE TABLE t2;
INSERT INTO t1 VALUES (1,2),(2,3);
INSERT INTO t2 VALUES (1,10),(2,30);
EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING IGNORE, IGNORE;
SELECT * FROM t1;
a b
1 2
2 3
SELECT * FROM t2;
a b
1 10
2 30
DROP TABLE t1, t2;
# multi-update and DEFAULT parameter (no default)
CREATE TABLE t1 (a INT, b INT NOT NULL);
INSERT INTO t1 VALUES (1,2),(2,3);
CREATE TABLE t2 (a INT, b INT NOT NULL);
INSERT INTO t2 VALUES (1,10),(2,30);
EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING DEFAULT, DEFAULT;
ERROR HY000: Field 'b' doesn't have a default value
DROP TABLE t1, t2;
# multi-update and IGNORE parameter (no default)
CREATE TABLE t1 (a INT, b INT NOT NULL);
INSERT INTO t1 VALUES (1,2),(2,3);
CREATE TABLE t2 (a INT, b INT NOT NULL);
INSERT INTO t2 VALUES (1,10),(2,30);
EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING IGNORE, IGNORE;
SELECT * FROM t1;
a b
1 2
2 3
SELECT * FROM t2;
a b
1 10
2 30
DROP TABLE t1, t2;
#
# End of 10.4 tests # End of 10.4 tests
# #

View File

@ -5243,6 +5243,125 @@ EXECUTE IMMEDIATE 'SELECT GROUP_CONCAT(@x) FROM t GROUP BY @x := f';
DROP TABLE t; DROP TABLE t;
--echo #
--echo # MDEV-15703: Crash in EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING DEFAULT
--echo #
PREPARE stmt FROM 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)';
--error ER_INVALID_DEFAULT_PARAM
EXECUTE stmt USING DEFAULT;
DEALLOCATE PREPARE stmt;
PREPARE stmt FROM 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)';
--error ER_INVALID_DEFAULT_PARAM
EXECUTE stmt USING IGNORE;
DEALLOCATE PREPARE stmt;
--error ER_INVALID_DEFAULT_PARAM
EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING DEFAULT;
--error ER_INVALID_DEFAULT_PARAM
EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING IGNORE;
--error ER_INVALID_DEFAULT_PARAM
EXECUTE IMMEDIATE 'BEGIN NOT ATOMIC DECLARE a INT DEFAULT ?; END' USING DEFAULT;
--error ER_INVALID_DEFAULT_PARAM
EXECUTE IMMEDIATE 'BEGIN NOT ATOMIC DECLARE a INT DEFAULT ?; END' USING IGNORE;
CREATE PROCEDURE p1(a INT) SELECT 1;
--error ER_INVALID_DEFAULT_PARAM
EXECUTE IMMEDIATE 'CALL p1(?)' USING DEFAULT;
--error ER_INVALID_DEFAULT_PARAM
EXECUTE IMMEDIATE 'CALL p1(?)' USING IGNORE;
DROP PROCEDURE p1;
--error ER_INVALID_DEFAULT_PARAM
EXECUTE IMMEDIATE 'SELECT ? UNION SELECT 1' USING DEFAULT;
--error ER_INVALID_DEFAULT_PARAM
EXECUTE IMMEDIATE 'SELECT ? UNION SELECT 1' USING IGNORE;
--error ER_INVALID_DEFAULT_PARAM
EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION ALL SELECT 1) AS derived' USING DEFAULT;
--error ER_INVALID_DEFAULT_PARAM
EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION ALL SELECT 1) AS derived' USING IGNORE;
--error ER_INVALID_DEFAULT_PARAM
EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION DISTINCT SELECT 1) AS derived' USING DEFAULT;
--error ER_INVALID_DEFAULT_PARAM
EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION DISTINCT SELECT 1) AS derived' USING IGNORE;
--echo # multi-update and DEFAULT
CREATE TABLE t1 (a INT, b INT DEFAULT a);
INSERT into t1 VALUES (1,2),(2,3);
CREATE TABLE t2 (a INT, b INT DEFAULT a);
INSERT INTO t2 VALUES (1,10),(2,30);
UPDATE t1,t2 SET t1.b = DEFAULT, t2.b = DEFAULT WHERE t1.a=t2.a;
SELECT * FROM t1;
SELECT * FROM t2;
--echo # re-check the case for Prepared Statement with parameters
TRUNCATE TABLE t1;
TRUNCATE TABLE t2;
INSERT INTO t1 VALUES (1,2),(2,3);
INSERT INTO t2 VALUES (1,10),(2,30);
EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING DEFAULT, DEFAULT;
SELECT * FROM t1;
SELECT * FROM t2;
# Cleanup
DROP TABLE t1, t2;
--echo # multi-update and IGNORE
CREATE TABLE t1 (a INT, b INT default a);
INSERT INTO t1 VALUES (1,2),(2,3);
CREATE TABLE t2 (a INT, b INT default a);
INSERT INTO t2 VALUES (1,10),(2,30);
UPDATE t1,t2 SET t1.b = IGNORE, t2.b = IGNORE WHERE t1.a=t2.a;
SELECT * FROM t1;
SELECT * FROM t2;
--echo # re-check the case for Prepared Statement with parameters
TRUNCATE TABLE t1;
TRUNCATE TABLE t2;
INSERT INTO t1 VALUES (1,2),(2,3);
INSERT INTO t2 VALUES (1,10),(2,30);
EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING IGNORE, IGNORE;
SELECT * FROM t1;
SELECT * FROM t2;
# Cleanup
DROP TABLE t1, t2;
--echo # multi-update and DEFAULT parameter (no default)
CREATE TABLE t1 (a INT, b INT NOT NULL);
INSERT INTO t1 VALUES (1,2),(2,3);
CREATE TABLE t2 (a INT, b INT NOT NULL);
INSERT INTO t2 VALUES (1,10),(2,30);
--error ER_NO_DEFAULT_FOR_FIELD
EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING DEFAULT, DEFAULT;
# Cleanup
DROP TABLE t1, t2;
--echo # multi-update and IGNORE parameter (no default)
CREATE TABLE t1 (a INT, b INT NOT NULL);
INSERT INTO t1 VALUES (1,2),(2,3);
CREATE TABLE t2 (a INT, b INT NOT NULL);
INSERT INTO t2 VALUES (1,10),(2,30);
EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING IGNORE, IGNORE;
SELECT * FROM t1;
SELECT * FROM t2;
# Cleanup
DROP TABLE t1, t2;
--echo # --echo #
--echo # End of 10.4 tests --echo # End of 10.4 tests
--echo # --echo #

View File

@ -34,13 +34,12 @@ set session use_stat_tables='preferably';
# Must NOT show "Engine-independent statistics collected": # Must NOT show "Engine-independent statistics collected":
alter table t1 analyze partition p0; alter table t1 analyze partition p0;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
# Should not have Handler_read_rnd_next=34 # Should not have Handler_read_rnd_next=34
show session status like 'Handler_read_rnd%'; show session status like 'Handler_read_rnd%';
Variable_name Value Variable_name Value
Handler_read_rnd 0 Handler_read_rnd 0
Handler_read_rnd_deleted 0 Handler_read_rnd_deleted 0
Handler_read_rnd_next 34 Handler_read_rnd_next 0
drop table t1; drop table t1;
SET use_stat_tables = DEFAULT; SET use_stat_tables = DEFAULT;

View File

@ -17,7 +17,6 @@ SET use_stat_tables = PREFERABLY;
CREATE TABLE t1 ( a INT ) ENGINE=MyISAM PARTITION BY HASH(a) PARTITIONS 2; CREATE TABLE t1 ( a INT ) ENGINE=MyISAM PARTITION BY HASH(a) PARTITIONS 2;
ALTER TABLE t1 ANALYZE PARTITION p1; ALTER TABLE t1 ANALYZE PARTITION p1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
include/show_binlog_events.inc include/show_binlog_events.inc
Log_name Pos Event_type Server_id End_log_pos Info Log_name Pos Event_type Server_id End_log_pos Info

View File

@ -2594,9 +2594,9 @@ ERROR HY000: 'ignore' is not allowed in this context
VALUES (DEFAULT); VALUES (DEFAULT);
ERROR HY000: 'default' is not allowed in this context ERROR HY000: 'default' is not allowed in this context
EXECUTE IMMEDIATE 'VALUES (?)' USING IGNORE; EXECUTE IMMEDIATE 'VALUES (?)' USING IGNORE;
ERROR HY000: 'ignore' is not allowed in this context ERROR HY000: Default/ignore value is not supported for such parameter usage
EXECUTE IMMEDIATE 'VALUES (?)' USING DEFAULT; EXECUTE IMMEDIATE 'VALUES (?)' USING DEFAULT;
ERROR HY000: 'default' is not allowed in this context ERROR HY000: Default/ignore value is not supported for such parameter usage
# #
# MDEV-24675: TVC using subqueries # MDEV-24675: TVC using subqueries
# #

View File

@ -1349,9 +1349,9 @@ DELIMITER ;$$
VALUES (IGNORE); VALUES (IGNORE);
--error ER_NOT_ALLOWED_IN_THIS_CONTEXT --error ER_NOT_ALLOWED_IN_THIS_CONTEXT
VALUES (DEFAULT); VALUES (DEFAULT);
--error ER_NOT_ALLOWED_IN_THIS_CONTEXT --error ER_INVALID_DEFAULT_PARAM
EXECUTE IMMEDIATE 'VALUES (?)' USING IGNORE; EXECUTE IMMEDIATE 'VALUES (?)' USING IGNORE;
--error ER_NOT_ALLOWED_IN_THIS_CONTEXT --error ER_INVALID_DEFAULT_PARAM
EXECUTE IMMEDIATE 'VALUES (?)' USING DEFAULT; EXECUTE IMMEDIATE 'VALUES (?)' USING DEFAULT;
--echo # --echo #

View File

@ -0,0 +1,6 @@
1
2
3
1
5
6

View File

@ -33,7 +33,6 @@ t1 CREATE TABLE `t1` (
PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE)
ALTER TABLE t1 ANALYZE PARTITION p1,p2; ALTER TABLE t1 ANALYZE PARTITION p1,p2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
SELECT * FROM t1 ORDER BY c1; SELECT * FROM t1 ORDER BY c1;
c1 c2 c1 c2

View File

@ -13,7 +13,6 @@
galera_as_slave_ctas : MDEV-28378 timeout galera_as_slave_ctas : MDEV-28378 timeout
galera_pc_recovery : MDEV-25199 cluster fails to start up galera_pc_recovery : MDEV-25199 cluster fails to start up
galera_sequences : MDEV-32561 WSREP FSM failure: no such a transition REPLICATING -> COMMITTED galera_sequences : MDEV-32561 WSREP FSM failure: no such a transition REPLICATING -> COMMITTED
galera_shutdown_nonprim : MDEV-32635 galera_shutdown_nonprim: mysql_shutdown failed
versioning_trx_id : MDEV-18590 : galera.versioning_trx_id: Test failure: mysqltest: Result content mismatch versioning_trx_id : MDEV-18590 : galera.versioning_trx_id: Test failure: mysqltest: Result content mismatch
galera_concurrent_ctas : MDEV-32779 galera_concurrent_ctas: assertion in the galera::ReplicatorSMM::finish_cert() galera_concurrent_ctas : MDEV-32779 galera_concurrent_ctas: assertion in the galera::ReplicatorSMM::finish_cert()
galera_as_slave_replay : MDEV-32780 galera_as_slave_replay: assertion in the wsrep::transaction::before_rollback() galera_as_slave_replay : MDEV-32780 galera_as_slave_replay: assertion in the wsrep::transaction::before_rollback()

View File

@ -3,21 +3,21 @@ connection node_1;
connect con1,127.0.0.1,root,,test,$NODE_MYPORT_1; connect con1,127.0.0.1,root,,test,$NODE_MYPORT_1;
--- CTAS with empty result set --- --- CTAS with empty result set ---
CREATE TABLE t1 (a INT) ENGINE=InnoDB; CREATE TABLE t1 (a INT) ENGINE=InnoDB;
SET DEBUG_SYNC = 'create_table_select_before_create SIGNAL may_alter WAIT_FOR bf_abort'; SET DEBUG_SYNC = 'create_table_select_before_create SIGNAL may_run WAIT_FOR bf_abort';
CREATE TABLE t2 SELECT * FROM t1; CREATE TABLE t2 SELECT * FROM t1;
connection node_1; connection node_1;
SET DEBUG_SYNC = 'now WAIT_FOR may_alter'; SET DEBUG_SYNC = 'now WAIT_FOR may_run';
ALTER TABLE t1 DROP FOREIGN KEY b, ALGORITHM=COPY; TRUNCATE TABLE t1;
connection con1; connection con1;
ERROR 70100: Query execution was interrupted ERROR 70100: Query execution was interrupted
SET DEBUG_SYNC = 'RESET'; SET DEBUG_SYNC = 'RESET';
--- CTAS with non-empty result set --- --- CTAS with non-empty result set ---
INSERT INTO t1 VALUES (10), (20), (30); INSERT INTO t1 VALUES (10), (20), (30);
SET DEBUG_SYNC = 'create_table_select_before_create SIGNAL may_alter WAIT_FOR bf_abort'; SET DEBUG_SYNC = 'create_table_select_before_create SIGNAL may_run WAIT_FOR bf_abort';
CREATE TABLE t2 SELECT * FROM t1; CREATE TABLE t2 SELECT * FROM t1;
connection node_1; connection node_1;
SET DEBUG_SYNC = 'now WAIT_FOR may_alter'; SET DEBUG_SYNC = 'now WAIT_FOR may_run';
ALTER TABLE t1 DROP FOREIGN KEY b, ALGORITHM=COPY; TRUNCATE TABLE t1;
connection con1; connection con1;
ERROR 70100: Query execution was interrupted ERROR 70100: Query execution was interrupted
SET DEBUG_SYNC = 'RESET'; SET DEBUG_SYNC = 'RESET';

View File

@ -14,7 +14,7 @@ c1
INSERT INTO t1 VALUES (4),(3),(1),(2); INSERT INTO t1 VALUES (4),(3),(1),(2);
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
CREATE TABLE t1 (pk INT PRIMARY KEY, b INT) ENGINE=SEQUENCE; CREATE TABLE t1 (pk INT PRIMARY KEY, b INT) ENGINE=SEQUENCE;
ERROR 42S01: Table 't1' already exists ERROR 42000: This version of MariaDB doesn't yet support 'non-InnoDB sequences in Galera cluster'
ALTER TABLE t1 DROP COLUMN c2; ALTER TABLE t1 DROP COLUMN c2;
ERROR 42000: Can't DROP COLUMN `c2`; check that it exists ERROR 42000: Can't DROP COLUMN `c2`; check that it exists
SELECT get_lock ('test', 1.5); SELECT get_lock ('test', 1.5);

View File

@ -0,0 +1,34 @@
connection node_2;
connection node_1;
connection node_1;
SET GLOBAL wsrep_load_data_splitting=ON;
Warnings:
Warning 1287 '@@wsrep_load_data_splitting' is deprecated and will be removed in a future release
SET GLOBAL wsrep_replicate_myisam=ON;
CREATE TABLE t1 (c1 int) ENGINE=MYISAM;
LOAD DATA INFILE '../../std_data/mdev-25731.dat' IGNORE INTO TABLE t1 LINES TERMINATED BY '\n';
Warnings:
Warning 1235 wsrep_load_data_splitting for other than InnoDB tables
SELECT COUNT(*) AS EXPECT_6 FROM t1;
EXPECT_6
6
connection node_2;
SELECT COUNT(*) AS EXPECT_6 FROM t1;
EXPECT_6
6
connection node_1;
ALTER TABLE t1 ENGINE=InnoDB;
LOAD DATA INFILE '../../std_data/mdev-25731.dat' IGNORE INTO TABLE t1 LINES TERMINATED BY '\n';
SELECT COUNT(*) AS EXPECT_12 FROM t1;
EXPECT_12
12
connection node_2;
SELECT COUNT(*) AS EXPECT_12 FROM t1;
EXPECT_12
12
connection node_1;
DROP TABLE t1;
SET GLOBAL wsrep_load_data_splitting=OFF;
Warnings:
Warning 1287 '@@wsrep_load_data_splitting' is deprecated and will be removed in a future release
SET GLOBAL wsrep_replicate_myisam=OFF;

View File

@ -1,7 +1,8 @@
connection node_2; connection node_2;
connection node_1; connection node_1;
connection node_1; connection node_1;
CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; SET @wsrep_slave_threads_orig = @@wsrep_slave_threads;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT) Engine=InnoDB;
SET GLOBAL wsrep_slave_threads = 10; SET GLOBAL wsrep_slave_threads = 10;
# Set slave threads to 10 step 1 # Set slave threads to 10 step 1
SELECT VARIABLE_VALUE AS EXPECT_10 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; SELECT VARIABLE_VALUE AS EXPECT_10 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count';
@ -9,7 +10,7 @@ EXPECT_10
10 10
SET GLOBAL wsrep_slave_threads = 1; SET GLOBAL wsrep_slave_threads = 1;
connection node_2; connection node_2;
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (NULL);
connection node_1; connection node_1;
# Wait until one of the appliers has exited # Wait until one of the appliers has exited
SELECT VARIABLE_VALUE AS EXPECT_9 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; SELECT VARIABLE_VALUE AS EXPECT_9 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count';
@ -27,33 +28,14 @@ EXPECT_20
20 20
SET GLOBAL wsrep_slave_threads = 1; SET GLOBAL wsrep_slave_threads = 1;
connection node_2; connection node_2;
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (2);
INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (5);
INSERT INTO t1 VALUES (6);
INSERT INTO t1 VALUES (7);
INSERT INTO t1 VALUES (8);
INSERT INTO t1 VALUES (9);
INSERT INTO t1 VALUES (10);
INSERT INTO t1 VALUES (11);
INSERT INTO t1 VALUES (12);
INSERT INTO t1 VALUES (13);
INSERT INTO t1 VALUES (14);
INSERT INTO t1 VALUES (16);
INSERT INTO t1 VALUES (17);
INSERT INTO t1 VALUES (18);
INSERT INTO t1 VALUES (19);
INSERT INTO t1 VALUES (20);
connection node_1; connection node_1;
# Wait until 19 of the appliers has exited # Wait until 19 of the appliers has exited
SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count';
EXPECT_1 EXPECT_1
1 1
SELECT COUNT(*) FROM t1; SELECT COUNT(*) AS EXPECT_51 FROM t1;
COUNT(*) EXPECT_51
20 51
SET GLOBAL wsrep_slave_threads = 10; SET GLOBAL wsrep_slave_threads = 10;
# Set slave threads to 10 step 3 # Set slave threads to 10 step 3
SELECT VARIABLE_VALUE AS EXPECT_10 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; SELECT VARIABLE_VALUE AS EXPECT_10 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count';
@ -62,22 +44,12 @@ EXPECT_10
connection node_1; connection node_1;
SET GLOBAL wsrep_slave_threads = 1; SET GLOBAL wsrep_slave_threads = 1;
connection node_2; connection node_2;
INSERT INTO t1 VALUES (21);
INSERT INTO t1 VALUES (22);
INSERT INTO t1 VALUES (23);
INSERT INTO t1 VALUES (24);
INSERT INTO t1 VALUES (25);
INSERT INTO t1 VALUES (26);
INSERT INTO t1 VALUES (27);
INSERT INTO t1 VALUES (28);
INSERT INTO t1 VALUES (29);
INSERT INTO t1 VALUES (30);
connection node_1; connection node_1;
# Wait until slave threads back to 1 # Wait until slave threads back to 1
SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count';
EXPECT_1 EXPECT_1
1 1
SELECT COUNT(*) FROM t1; SELECT COUNT(*) AS EXPECT_101 FROM t1;
COUNT(*) EXPECT_101
30 101
DROP TABLE t1; DROP TABLE t1;

View File

@ -1,44 +1,68 @@
connection node_2; connection node_2;
connection node_1; connection node_1;
connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb;
CREATE TABLE t2 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb; CREATE TABLE t2 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb;
INSERT INTO t1 VALUES (1, 'a'); INSERT INTO t1 VALUES (1, 'a');
INSERT INTO t1 VALUES (2, 'a'); INSERT INTO t1 VALUES (2, 'a');
connection node_1;
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
START TRANSACTION; START TRANSACTION;
UPDATE t1 SET f2 = 'b' WHERE f1 = 1; UPDATE t1 SET f2 = 'b' WHERE f1 = 1;
connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1;
connection node_1a; connection node_1a;
SET SESSION wsrep_sync_wait=0;
LOCK TABLE t2 WRITE; LOCK TABLE t2 WRITE;
connection node_1; connection node_1;
SET @@debug_dbug = "d,sync.wsrep_before_mdl_wait"; SET DEBUG_SYNC= 'wsrep_before_mdl_wait SIGNAL before_mdl_wait WAIT_FOR mdl_wait_continue';
SELECT * FROM t2;; SELECT * FROM t2;;
connection node_1a; connection node_1a;
# Wait until select is blocked before MDL lock wait
SET DEBUG_SYNC= 'now WAIT_FOR before_mdl_wait';
connection node_1a;
SET @@debug_dbug = "d,sync.wsrep_after_BF_victim_lock"; SET @@debug_dbug = "d,sync.wsrep_after_BF_victim_lock";
connection node_2; connection node_2;
UPDATE t1 SET f2 = 'c' WHERE f1 = 1; UPDATE t1 SET f2 = 'c' WHERE f1 = 1;
connection node_1a; connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1;
SET @@debug_dbug = ""; connection node_1b;
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_before_mdl_wait"; SET SESSION wsrep_sync_wait=0;
# Wait for conflicting update to block
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_after_BF_victim_lock"; SET DEBUG_SYNC = "now SIGNAL signal.wsrep_after_BF_victim_lock";
connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1;
connection node_1c;
connection node_1a;
SET DEBUG_SYNC = "now SIGNAL BF_victim_continue";
UNLOCK TABLES; UNLOCK TABLES;
connection node_1; connection node_1;
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'a'; connection node_1;
COUNT(*) = 1 SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'a';
EXPECT_1
1 1
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'c';
COUNT(*) = 1 EXPECT_1
1 1
SELECT * FROM t1;
f1 f2
1 c
2 a
connection node_2; connection node_2;
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'a'; SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'a';
COUNT(*) = 1 EXPECT_1
1 1
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'c';
COUNT(*) = 1 EXPECT_1
1 1
SELECT * FROM t1;
f1 f2
1 c
2 a
DROP TABLE t1; DROP TABLE t1;
DROP TABLE t2; DROP TABLE t2;
connection node_1a; connection node_1a;
SET DEBUG_SYNC = "RESET"; SET DEBUG_SYNC = "RESET";
connection node_1b;
SET DEBUG_SYNC = "RESET";
connection node_1;
disconnect node_1a;
disconnect node_1b;
disconnect node_1c;

View File

@ -1,5 +1,6 @@
connection node_2; connection node_2;
connection node_1; connection node_1;
SET GLOBAL wsrep_replicate_myisam=ON;
CREATE TABLE t1 (f1 INTEGER) ENGINE=MyISAM; CREATE TABLE t1 (f1 INTEGER) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (2), (3); INSERT INTO t1 VALUES (2), (3);
@ -14,14 +15,37 @@ UPDATE t1 SET f1 = 9;
UPDATE t2 SET f1 = 9 WHERE f1 = 1; UPDATE t2 SET f1 = 9 WHERE f1 = 1;
DELETE FROM t1 WHERE f1 = 9; DELETE FROM t1 WHERE f1 = 9;
DELETE FROM t2 WHERE f1 = 9; DELETE FROM t2 WHERE f1 = 9;
TRUNCATE TABLE t1; SELECT * FROM t1 ORDER BY f1;
TRUNCATE TABLE t1; f1
SELECT * FROM t2 ORDER BY f1;
f1
2
3
4
5
6
connection node_2; connection node_2;
SELECT COUNT(*) = 0 FROM t1; SELECT * FROM t1 ORDER BY f1;
COUNT(*) = 0 f1
1 SELECT * FROM t2 ORDER BY f1;
SELECT COUNT(*) = 0 FROM t2; f1
COUNT(*) = 0 2
1 3
4
5
6
TRUNCATE TABLE t1;
TRUNCATE TABLE t2;
SELECT * FROM t1 ORDER BY f1;
f1
SELECT * FROM t2 ORDER BY f1;
f1
connection node_2;
SELECT * FROM t1 ORDER BY f1;
f1
SELECT * FROM t2 ORDER BY f1;
f1
connection node_1;
SET GLOBAL wsrep_replicate_myisam=OFF;
DROP TABLE t1; DROP TABLE t1;
DROP TABLE t2; DROP TABLE t2;

View File

@ -0,0 +1,12 @@
connection node_2;
connection node_1;
SET GLOBAL wsrep_ignore_apply_errors=0;
SET SESSION AUTOCOMMIT=0;
SET SESSION max_error_count=0;
CREATE TABLE t0 (id GEOMETRY,parent_id GEOMETRY)ENGINE=SEQUENCE;
ERROR 42000: This version of MariaDB doesn't yet support 'non-InnoDB sequences in Galera cluster'
connection node_2;
SHOW CREATE TABLE t0;
ERROR 42S02: Table 'test.t0' doesn't exist
connection node_1;
SET GLOBAL wsrep_ignore_apply_errors=DEFAULT;

View File

@ -5,7 +5,12 @@ connection node_2;
connection node_1; connection node_1;
SET GLOBAL wsrep_provider_options = 'pc.weight=2'; SET GLOBAL wsrep_provider_options = 'pc.weight=2';
connection node_2; connection node_2;
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
SET SESSION wsrep_sync_wait = 0; SET SESSION wsrep_sync_wait = 0;
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
connection node_1;
connection node_2;
SHOW STATUS LIKE 'wsrep_cluster_status';
Variable_name Value
wsrep_cluster_status non-Primary
connection node_1; connection node_1;
SET GLOBAL wsrep_provider_options = 'pc.weight = 1'; SET GLOBAL wsrep_provider_options = 'pc.weight = 1';

View File

@ -0,0 +1,244 @@
connection node_2;
connection node_1;
# Case 1 CREATE SEQUENCE with no NOCACHE
CREATE SEQUENCE s ENGINE=InnoDB;
ERROR 42000: This version of MariaDB doesn't yet support 'CACHE without INCREMENT BY 0 in Galera cluster'
CREATE SEQUENCE s NOCACHE ENGINE=InnoDB;
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
START TRANSACTION;
REPLACE INTO s VALUES (1,1,9223372036854775806,1,1,1000,0,0);
OPTIMIZE TABLE t1;
Table Op Msg_type Msg_text
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
test.t1 optimize status OK
SELECT * FROM t1;
a
SELECT * FROM s;
next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count
1 1 9223372036854775806 1 1 1000 0 0
connection node_2;
SELECT * FROM t1;
a
SELECT * FROM s;
next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count
1 1 9223372036854775806 1 1 1000 0 0
connection node_1;
DROP TABLE t1;
DROP SEQUENCE s;
# Case 2 REPLACE INTO ... SELECT with error
CREATE TABLE t (id INT KEY,a YEAR,INDEX (id,a)) engine=innodb;
REPLACE INTO t (id,a)SELECT /*!99997 */ 1;
ERROR 21S01: Column count doesn't match value count at row 1
REPLACE INTO t (id,a)SELECT /*!99997 */ 1,2;
SELECT * FROM t;
id a
1 2002
CREATE TABLE t2 (id INT KEY,a YEAR,INDEX (id,a)) engine=myisam;
REPLACE INTO t2 (id,a)SELECT /*!99997 */ 1;
ERROR 21S01: Column count doesn't match value count at row 1
REPLACE INTO t2 (id,a)SELECT /*!99997 */ 1,2;
Warnings:
Warning 138 Galera cluster does support consistency check only for InnoDB tables.
SELECT * FROM t2;
id a
1 2002
CREATE TABLE t3 (id INT KEY,a YEAR,INDEX (id,a)) engine=aria;
REPLACE INTO t3 (id,a)SELECT /*!99997 */ 1;
ERROR 21S01: Column count doesn't match value count at row 1
REPLACE INTO t3 (id,a)SELECT /*!99997 */ 1,2;
Warnings:
Warning 138 Galera cluster does support consistency check only for InnoDB tables.
SELECT * FROM t3;
id a
1 2002
connection node_2;
SELECT * FROM t;
id a
1 2002
SELECT * FROM t2;
id a
1 2002
SELECT * FROM t3;
id a
1 2002
connection node_1;
DROP TABLE t,t2,t3;
# Bigger REPLACE ... AS SELECT test
SET GLOBAL wsrep_replicate_myisam=ON;
CREATE TABLE t1(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t2(id int not null primary key ,b int) ENGINE=MyISAM;
CREATE TABLE t3(id int not null primary key ,b int) ENGINE=Aria;
CREATE TABLE t4(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t5(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t6(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t7(id int not null primary key ,b int) ENGINE=MyISAM;
CREATE TABLE t8(id int not null primary key ,b int) ENGINE=Aria;
INSERT INTO t1(id) SELECT seq FROM seq_1_to_1000;
INSERT INTO t2(id) SELECT seq FROM seq_1_to_1000;
INSERT INTO t3(id) SELECT seq FROM seq_1_to_1000;
REPLACE INTO t4 SELECT * FROM t1;
REPLACE INTO t5 SELECT * FROM t2;
REPLACE INTO t6 SELECT * FROM t3;
ERROR HY000: Transactional commit not supported by involved engine(s)
REPLACE INTO t7 SELECT * FROM t2;
REPLACE INTO t8 SELECT * FROM t3;
SELECT COUNT(*) AS EXPECT_1000 FROM t1;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t2;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t3;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t4;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t5;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_0 FROM t6;
EXPECT_0
0
SELECT COUNT(*) AS EXPECT_1000 FROM t7;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t8;
EXPECT_1000
1000
connection node_2;
SELECT COUNT(*) AS EXPECT_1000 FROM t1;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t2;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t3;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t4;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t5;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_0 FROM t6;
EXPECT_0
0
SELECT COUNT(*) AS EXPECT_1000 FROM t7;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t8;
EXPECT_1000
1000
connection node_1;
DROP TABLE t1,t2,t3,t4,t5,t6,t7,t8;
# Bigger INSERT INTO ... SELECT test
CREATE TABLE t1(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t2(id int not null primary key ,b int) ENGINE=MyISAM;
CREATE TABLE t3(id int not null primary key ,b int) ENGINE=Aria;
CREATE TABLE t4(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t5(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t6(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t7(id int not null primary key ,b int) ENGINE=MyISAM;
CREATE TABLE t8(id int not null primary key ,b int) ENGINE=Aria;
INSERT INTO t1(id) SELECT seq FROM seq_1_to_1000;
INSERT INTO t2(id) SELECT seq FROM seq_1_to_1000;
INSERT INTO t3(id) SELECT seq FROM seq_1_to_1000;
INSERT INTO t4 SELECT * FROM t1;
INSERT INTO t5 SELECT * FROM t2;
INSERT INTO t6 SELECT * FROM t3;
ERROR HY000: Transactional commit not supported by involved engine(s)
INSERT INTO t7 SELECT * FROM t2;
INSERT INTO t8 SELECT * FROM t3;
SELECT COUNT(*) AS EXPECT_1000 FROM t1;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t2;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t3;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t4;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t5;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_0 FROM t6;
EXPECT_0
0
SELECT COUNT(*) AS EXPECT_1000 FROM t7;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t8;
EXPECT_1000
1000
connection node_2;
SELECT COUNT(*) AS EXPECT_1000 FROM t1;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t2;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t3;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t4;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t5;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_0 FROM t6;
EXPECT_0
0
SELECT COUNT(*) AS EXPECT_1000 FROM t7;
EXPECT_1000
1000
SELECT COUNT(*) AS EXPECT_1000 FROM t8;
EXPECT_1000
1000
connection node_1;
DROP TABLE t1,t2,t3,t4,t5,t6,t7,t8;
CREATE TABLE t1(pk int not null primary key) engine=innodb;
INSERT INTO t1 values (1),(2),(3),(4);
CREATE VIEW view_t1 AS SELECT * FROM t1;
INSERT INTO view_t1 VALUES (5);
SELECT * FROM t1;
pk
1
2
3
4
5
DROP TABLE t1;
DROP VIEW view_t1;
CREATE TABLE t1(pk int not null primary key) engine=myisam;
INSERT INTO t1 values (1),(2),(3),(4);
CREATE VIEW view_t1 AS SELECT * FROM t1;
INSERT INTO view_t1 VALUES (5);
SELECT * FROM t1;
pk
1
2
3
4
5
DROP TABLE t1;
DROP VIEW view_t1;
CREATE TABLE t1(pk int not null primary key) engine=aria;
INSERT INTO t1 values (1),(2),(3),(4);
CREATE VIEW view_t1 AS SELECT * FROM t1;
INSERT INTO view_t1 VALUES (5);
SELECT * FROM t1;
pk
1
2
3
4
5
DROP TABLE t1;
DROP VIEW view_t1;
SET GLOBAL wsrep_replicate_myisam=OFF;

View File

@ -1,23 +1,8 @@
connection node_2; connection node_2;
connection node_1; connection node_1;
connection node_1; connection node_1;
connection node_2;
connection node_1;
CREATE TABLE t ENGINE=InnoDB WITH SYSTEM VERSIONING AS SELECT 1 AS i; CREATE TABLE t ENGINE=InnoDB WITH SYSTEM VERSIONING AS SELECT 1 AS i;
ERROR 42000: This version of MariaDB doesn't yet support 'SYSTEM VERSIONING AS SELECT in Galera cluster'
connection node_2;
SHOW CREATE TABLE t; SHOW CREATE TABLE t;
Table Create Table ERROR 42S02: Table 'test.t' doesn't exist
t CREATE TABLE `t` (
`i` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
SELECT * from t;
i
1
DROP TABLE IF EXISTS t;
COMMIT;
connection node_2;
SET SESSION wsrep_sync_wait=0;
Killing server ...
Starting server ...
connection node_2;
call mtr.add_suppression("WSREP: Event .*Write_rows_v1 apply failed:.*");
call mtr.add_suppression("SREP: Failed to apply write set: gtid:.*");

View File

@ -18,19 +18,16 @@
CREATE TABLE t1 (a INT) ENGINE=InnoDB; CREATE TABLE t1 (a INT) ENGINE=InnoDB;
# Run CTAS until the resulting table gets created, # Run CTAS until the resulting table gets created,
# then it gets BF aborted by ALTER. # then it gets BF aborted by other DDL.
SET DEBUG_SYNC = 'create_table_select_before_create SIGNAL may_alter WAIT_FOR bf_abort'; SET DEBUG_SYNC = 'create_table_select_before_create SIGNAL may_run WAIT_FOR bf_abort';
--send --send
CREATE TABLE t2 SELECT * FROM t1; CREATE TABLE t2 SELECT * FROM t1;
# Wait for CTAS to reach the table create point, # Wait for CTAS to reach the table create point,
# start executing ALTER and BF abort CTAS. # start executing other DDL and BF abort CTAS.
--connection node_1 --connection node_1
SET DEBUG_SYNC = 'now WAIT_FOR may_alter'; SET DEBUG_SYNC = 'now WAIT_FOR may_run';
--disable_result_log TRUNCATE TABLE t1;
--error ER_ERROR_ON_RENAME
ALTER TABLE t1 DROP FOREIGN KEY b, ALGORITHM=COPY;
--enable_result_log
--connection con1 --connection con1
# CTAS gets BF aborted. # CTAS gets BF aborted.
@ -46,19 +43,16 @@ SET DEBUG_SYNC = 'RESET';
INSERT INTO t1 VALUES (10), (20), (30); INSERT INTO t1 VALUES (10), (20), (30);
# Run CTAS until the resulting table gets created, # Run CTAS until the resulting table gets created,
# then it gets BF aborted by ALTER. # then it gets BF aborted by other DDL.
SET DEBUG_SYNC = 'create_table_select_before_create SIGNAL may_alter WAIT_FOR bf_abort'; SET DEBUG_SYNC = 'create_table_select_before_create SIGNAL may_run WAIT_FOR bf_abort';
--send --send
CREATE TABLE t2 SELECT * FROM t1; CREATE TABLE t2 SELECT * FROM t1;
# Wait for CTAS to reach the table create point, # Wait for CTAS to reach the table create point,
# start executing ALTER and BF abort CTAS. # start executing other DDL and BF abort CTAS.
--connection node_1 --connection node_1
SET DEBUG_SYNC = 'now WAIT_FOR may_alter'; SET DEBUG_SYNC = 'now WAIT_FOR may_run';
--disable_result_log TRUNCATE TABLE t1;
--error ER_ERROR_ON_RENAME
ALTER TABLE t1 DROP FOREIGN KEY b, ALGORITHM=COPY;
--enable_result_log
--connection con1 --connection con1
# CTAS gets BF aborted. # CTAS gets BF aborted.

View File

@ -11,7 +11,11 @@ SET SESSION autocommit=0;
SELECT * FROM t1 WHERE c1 <=0 ORDER BY c1 DESC; SELECT * FROM t1 WHERE c1 <=0 ORDER BY c1 DESC;
--error ER_LOCK_DEADLOCK --error ER_LOCK_DEADLOCK
INSERT INTO t1 VALUES (4),(3),(1),(2); INSERT INTO t1 VALUES (4),(3),(1),(2);
--error ER_TABLE_EXISTS_ERROR #
# This is because support for CREATE TABLE ENGINE=SEQUENCE
# is done before we check does table exists already.
#
--error ER_NOT_SUPPORTED_YET
CREATE TABLE t1 (pk INT PRIMARY KEY, b INT) ENGINE=SEQUENCE; CREATE TABLE t1 (pk INT PRIMARY KEY, b INT) ENGINE=SEQUENCE;
--error ER_CANT_DROP_FIELD_OR_KEY --error ER_CANT_DROP_FIELD_OR_KEY
ALTER TABLE t1 DROP COLUMN c2; ALTER TABLE t1 DROP COLUMN c2;

View File

@ -0,0 +1,27 @@
--source include/galera_cluster.inc
--source include/have_aria.inc
--connection node_1
SET GLOBAL wsrep_load_data_splitting=ON;
SET GLOBAL wsrep_replicate_myisam=ON;
CREATE TABLE t1 (c1 int) ENGINE=MYISAM;
LOAD DATA INFILE '../../std_data/mdev-25731.dat' IGNORE INTO TABLE t1 LINES TERMINATED BY '\n';
SELECT COUNT(*) AS EXPECT_6 FROM t1;
--connection node_2
SELECT COUNT(*) AS EXPECT_6 FROM t1;
--connection node_1
ALTER TABLE t1 ENGINE=InnoDB;
LOAD DATA INFILE '../../std_data/mdev-25731.dat' IGNORE INTO TABLE t1 LINES TERMINATED BY '\n';
SELECT COUNT(*) AS EXPECT_12 FROM t1;
--connection node_2
SELECT COUNT(*) AS EXPECT_12 FROM t1;
--connection node_1
DROP TABLE t1;
SET GLOBAL wsrep_load_data_splitting=OFF;
SET GLOBAL wsrep_replicate_myisam=OFF;

View File

@ -2,6 +2,8 @@
[mysqld.1] [mysqld.1]
wsrep-debug=SERVER wsrep-debug=SERVER
loose-wsrep-mw-336=1
[mysqld.2] [mysqld.2]
wsrep-debug=SERVER wsrep-debug=SERVER
loose-wsrep-mw-336=2

View File

@ -3,11 +3,12 @@
# #
--source include/galera_cluster.inc --source include/galera_cluster.inc
--source include/have_innodb.inc
--source include/force_restart.inc --source include/force_restart.inc
--source include/have_sequence.inc
--connection node_1 --connection node_1
CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; SET @wsrep_slave_threads_orig = @@wsrep_slave_threads;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT) Engine=InnoDB;
SET GLOBAL wsrep_slave_threads = 10; SET GLOBAL wsrep_slave_threads = 10;
@ -22,7 +23,7 @@ SELECT VARIABLE_VALUE AS EXPECT_10 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE V
SET GLOBAL wsrep_slave_threads = 1; SET GLOBAL wsrep_slave_threads = 1;
--connection node_2 --connection node_2
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (NULL);
--connection node_1 --connection node_1
--echo # Wait until one of the appliers has exited --echo # Wait until one of the appliers has exited
@ -54,27 +55,19 @@ SELECT VARIABLE_VALUE AS EXPECT_20 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE V
SET GLOBAL wsrep_slave_threads = 1; SET GLOBAL wsrep_slave_threads = 1;
--connection node_2 --connection node_2
INSERT INTO t1 VALUES (1); --disable_query_log
INSERT INTO t1 VALUES (2); let $c = 50;
INSERT INTO t1 VALUES (3); while ($c) {
INSERT INTO t1 VALUES (4); INSERT INTO t1 VALUES(NULL); COMMIT;
INSERT INTO t1 VALUES (5); dec $c;
INSERT INTO t1 VALUES (6); }
INSERT INTO t1 VALUES (7); --enable_query_log
INSERT INTO t1 VALUES (8);
INSERT INTO t1 VALUES (9);
INSERT INTO t1 VALUES (10);
INSERT INTO t1 VALUES (11);
INSERT INTO t1 VALUES (12);
INSERT INTO t1 VALUES (13);
INSERT INTO t1 VALUES (14);
INSERT INTO t1 VALUES (16);
INSERT INTO t1 VALUES (17);
INSERT INTO t1 VALUES (18);
INSERT INTO t1 VALUES (19);
INSERT INTO t1 VALUES (20);
--connection node_1 --connection node_1
--let $wait_condition = SELECT COUNT(*) = 51 FROM t1;
--let $wait_condition_on_error_output = SELECT COUNT(*) FROM t1;
--source include/wait_condition_with_debug.inc
--echo # Wait until 19 of the appliers has exited --echo # Wait until 19 of the appliers has exited
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; --let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count';
--let $wait_condition_on_error_output = SELECT COUNT(*), 1 as EXPECTED_VALUE FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle'; show processlist --let $wait_condition_on_error_output = SELECT COUNT(*), 1 as EXPECTED_VALUE FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle'; show processlist
@ -82,7 +75,7 @@ INSERT INTO t1 VALUES (20);
SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count';
SELECT COUNT(*) FROM t1; SELECT COUNT(*) AS EXPECT_51 FROM t1;
SET GLOBAL wsrep_slave_threads = 10; SET GLOBAL wsrep_slave_threads = 10;
--echo # Set slave threads to 10 step 3 --echo # Set slave threads to 10 step 3
@ -96,16 +89,13 @@ SELECT VARIABLE_VALUE AS EXPECT_10 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE V
SET GLOBAL wsrep_slave_threads = 1; SET GLOBAL wsrep_slave_threads = 1;
--connection node_2 --connection node_2
INSERT INTO t1 VALUES (21); --disable_query_log
INSERT INTO t1 VALUES (22); let $c = 50;
INSERT INTO t1 VALUES (23); while ($c) {
INSERT INTO t1 VALUES (24); INSERT INTO t1 VALUES(NULL); COMMIT;
INSERT INTO t1 VALUES (25); dec $c;
INSERT INTO t1 VALUES (26); }
INSERT INTO t1 VALUES (27); --enable_query_log
INSERT INTO t1 VALUES (28);
INSERT INTO t1 VALUES (29);
INSERT INTO t1 VALUES (30);
--connection node_1 --connection node_1
--echo # Wait until slave threads back to 1 --echo # Wait until slave threads back to 1
@ -115,6 +105,10 @@ INSERT INTO t1 VALUES (30);
SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count';
SELECT COUNT(*) FROM t1; SELECT COUNT(*) AS EXPECT_101 FROM t1;
DROP TABLE t1; DROP TABLE t1;
--disable_query_log
SET GLOBAL wsrep_slave_threads = @wsrep_slave_threads_orig;
--enable_query_log

View File

@ -3,70 +3,92 @@
# #
--source include/galera_cluster.inc --source include/galera_cluster.inc
--source include/have_debug.inc
--source include/have_debug_sync.inc --source include/have_debug_sync.inc
--connection node_1
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb;
CREATE TABLE t2 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb; CREATE TABLE t2 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb;
INSERT INTO t1 VALUES (1, 'a'); INSERT INTO t1 VALUES (1, 'a');
INSERT INTO t1 VALUES (2, 'a'); INSERT INTO t1 VALUES (2, 'a');
--connection node_1
SET AUTOCOMMIT=ON; SET AUTOCOMMIT=ON;
START TRANSACTION; START TRANSACTION;
UPDATE t1 SET f2 = 'b' WHERE f1 = 1; UPDATE t1 SET f2 = 'b' WHERE f1 = 1;
# block access to t2 # block access to t2
--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1
--connection node_1a --connection node_1a
SET SESSION wsrep_sync_wait=0;
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'
--let $wait_condition_on_error_output = SELECT * FROM INFORMATION_SCHEMA.TABLES
--source include/wait_condition_with_debug.inc
LOCK TABLE t2 WRITE; LOCK TABLE t2 WRITE;
# Block before MLD lock wait # Block before MDL lock wait
--connection node_1 --connection node_1
SET @@debug_dbug = "d,sync.wsrep_before_mdl_wait"; SET DEBUG_SYNC= 'wsrep_before_mdl_wait SIGNAL before_mdl_wait WAIT_FOR mdl_wait_continue';
--send SELECT * FROM t2; --send SELECT * FROM t2;
# Wait for SELECT to be blocked
--connection node_1a --connection node_1a
#--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIS WHERE STATE = 'System lock'; --echo # Wait until select is blocked before MDL lock wait
#--source include/wait_condition.inc SET DEBUG_SYNC= 'now WAIT_FOR before_mdl_wait';
#--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'init' AND INFO = 'COMMIT';
#--source include/wait_condition.inc
# block applier to wait after BF victim is locked # block applier to wait after BF victim is locked
--connection node_1a
SET @@debug_dbug = "d,sync.wsrep_after_BF_victim_lock"; SET @@debug_dbug = "d,sync.wsrep_after_BF_victim_lock";
# Issue a conflicting update on node #2 # Issue a conflicting update on node #2
--connection node_2 --connection node_2
UPDATE t1 SET f2 = 'c' WHERE f1 = 1; UPDATE t1 SET f2 = 'c' WHERE f1 = 1;
# Unblock the SELECT, to enter wsrep_thd_is_BF --connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1
--connection node_1a --connection node_1b
SET @@debug_dbug = ""; SET SESSION wsrep_sync_wait=0;
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_before_mdl_wait"; --echo # Wait for conflicting update to block
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Update_rows_log_event:%';
--source include/wait_condition.inc
# unblock applier to try to BF the SELECT # Unblock the SELECT, to enter wsrep_thd_is_BF
SET DEBUG_SYNC = "now SIGNAL signal.wsrep_after_BF_victim_lock"; SET DEBUG_SYNC = "now SIGNAL signal.wsrep_after_BF_victim_lock";
--connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1
--connection node_1c
--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Update_rows_log_event:%';
--source include/wait_condition.inc
--connection node_1a
# unblock applier to try to BF the SELECT
SET DEBUG_SYNC = "now SIGNAL BF_victim_continue";
# table lock is not needed anymore # table lock is not needed anymore
UNLOCK TABLES; UNLOCK TABLES;
# SELECT succeeds # SELECT returns deadlock
--connection node_1 --connection node_1
--error ER_LOCK_DEADLOCK --error ER_LOCK_DEADLOCK
--reap --reap
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'a'; --connection node_1
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'a';
SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'c';
SELECT * FROM t1;
--connection node_2 --connection node_2
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'a'; SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'a';
SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'c';
SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
DROP TABLE t2; DROP TABLE t2;
--connection node_1a --connection node_1a
SET DEBUG_SYNC = "RESET"; SET DEBUG_SYNC = "RESET";
--connection node_1b
SET DEBUG_SYNC = "RESET";
--connection node_1
--disconnect node_1a
--disconnect node_1b
--disconnect node_1c

View File

@ -2,20 +2,24 @@
--source include/have_innodb.inc --source include/have_innodb.inc
# #
# This tests simple autocommit replication of MyISAM tables. No updates arrive on the slave. # This tests simple autocommit replication of MyISAM tables.
# #
SET GLOBAL wsrep_replicate_myisam=ON;
# Without a PK # Without a PK
CREATE TABLE t1 (f1 INTEGER) ENGINE=MyISAM; CREATE TABLE t1 (f1 INTEGER) ENGINE=MyISAM;
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (2), (3); INSERT INTO t1 VALUES (2), (3);
# This is TOI
INSERT INTO t1 SELECT 4 FROM DUAL UNION ALL SELECT 5 FROM DUAL; INSERT INTO t1 SELECT 4 FROM DUAL UNION ALL SELECT 5 FROM DUAL;
CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) ENGINE=MyISAM; CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) ENGINE=MyISAM;
INSERT INTO t2 VALUES (1); INSERT INTO t2 VALUES (1);
INSERT INTO t2 VALUES (2), (3); INSERT INTO t2 VALUES (2), (3);
# This is TOI
INSERT INTO t2 SELECT 4 FROM DUAL UNION ALL SELECT 5 FROM DUAL; INSERT INTO t2 SELECT 4 FROM DUAL UNION ALL SELECT 5 FROM DUAL;
# Error # Error
@ -32,14 +36,26 @@ UPDATE t2 SET f1 = 9 WHERE f1 = 1;
DELETE FROM t1 WHERE f1 = 9; DELETE FROM t1 WHERE f1 = 9;
DELETE FROM t2 WHERE f1 = 9; DELETE FROM t2 WHERE f1 = 9;
SELECT * FROM t1 ORDER BY f1;
SELECT * FROM t2 ORDER BY f1;
--connection node_2
SELECT * FROM t1 ORDER BY f1;
SELECT * FROM t2 ORDER BY f1;
# TRUNCATE # TRUNCATE
TRUNCATE TABLE t1; TRUNCATE TABLE t1;
TRUNCATE TABLE t1; TRUNCATE TABLE t2;
SELECT * FROM t1 ORDER BY f1;
SELECT * FROM t2 ORDER BY f1;
--connection node_2 --connection node_2
SELECT COUNT(*) = 0 FROM t1; SELECT * FROM t1 ORDER BY f1;
SELECT COUNT(*) = 0 FROM t2; SELECT * FROM t2 ORDER BY f1;
--connection node_1
SET GLOBAL wsrep_replicate_myisam=OFF;
DROP TABLE t1; DROP TABLE t1;
DROP TABLE t2; DROP TABLE t2;

View File

@ -0,0 +1,16 @@
--source include/galera_cluster.inc
--source include/have_sequence.inc
SET GLOBAL wsrep_ignore_apply_errors=0;
SET SESSION AUTOCOMMIT=0;
SET SESSION max_error_count=0;
--error ER_NOT_SUPPORTED_YET
CREATE TABLE t0 (id GEOMETRY,parent_id GEOMETRY)ENGINE=SEQUENCE;
--connection node_2
--error ER_NO_SUCH_TABLE
SHOW CREATE TABLE t0;
--connection node_1
SET GLOBAL wsrep_ignore_apply_errors=DEFAULT;

View File

@ -16,21 +16,27 @@ SET GLOBAL wsrep_provider_options = 'pc.weight=2';
--connection node_2 --connection node_2
# Isolate node_2 from the group and wait until wsrep_ready becomes OFF. # Isolate node_2 from the group and wait until wsrep_ready becomes OFF.
SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
SET SESSION wsrep_sync_wait = 0; SET SESSION wsrep_sync_wait = 0;
--let $wait_condition = SELECT VARIABLE_VALUE = 'OFF' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready' SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1';
--source include/wait_condition.inc
# Verify that graceful shutdown succeeds.
--source include/shutdown_mysqld.inc
--source include/start_mysqld.inc
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--connection node_1 --connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--connection node_2
--let $wait_condition = SELECT VARIABLE_VALUE = 'OFF' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'
--source include/wait_condition.inc
SHOW STATUS LIKE 'wsrep_cluster_status';
# Verify that graceful shutdown succeeds.
--source include/shutdown_mysqld.inc
--source include/start_mysqld.inc
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc --source include/wait_condition.inc
# Restore original settings. # Restore original settings.
SET GLOBAL wsrep_provider_options = 'pc.weight = 1'; SET GLOBAL wsrep_provider_options = 'pc.weight = 1';
--source include/auto_increment_offset_restore.inc --source include/auto_increment_offset_restore.inc

View File

@ -0,0 +1,190 @@
--source include/galera_cluster.inc
--source include/have_innodb.inc
--source include/have_log_bin.inc
--source include/have_sequence.inc
--source include/have_aria.inc
--echo # Case 1 CREATE SEQUENCE with no NOCACHE
--error ER_NOT_SUPPORTED_YET
CREATE SEQUENCE s ENGINE=InnoDB;
CREATE SEQUENCE s NOCACHE ENGINE=InnoDB;
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
START TRANSACTION;
REPLACE INTO s VALUES (1,1,9223372036854775806,1,1,1000,0,0);
OPTIMIZE TABLE t1;
SELECT * FROM t1;
SELECT * FROM s;
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'
--source include/wait_condition.inc
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 's'
--source include/wait_condition.inc
--let $wait_condition = SELECT COUNT(*) = 1 FROM test.s;
--source include/wait_condition.inc
SELECT * FROM t1;
SELECT * FROM s;
--connection node_1
DROP TABLE t1;
DROP SEQUENCE s;
--echo # Case 2 REPLACE INTO ... SELECT with error
CREATE TABLE t (id INT KEY,a YEAR,INDEX (id,a)) engine=innodb;
--error ER_WRONG_VALUE_COUNT_ON_ROW
REPLACE INTO t (id,a)SELECT /*!99997 */ 1;
REPLACE INTO t (id,a)SELECT /*!99997 */ 1,2;
SELECT * FROM t;
CREATE TABLE t2 (id INT KEY,a YEAR,INDEX (id,a)) engine=myisam;
--error ER_WRONG_VALUE_COUNT_ON_ROW
REPLACE INTO t2 (id,a)SELECT /*!99997 */ 1;
REPLACE INTO t2 (id,a)SELECT /*!99997 */ 1,2;
SELECT * FROM t2;
CREATE TABLE t3 (id INT KEY,a YEAR,INDEX (id,a)) engine=aria;
--error ER_WRONG_VALUE_COUNT_ON_ROW
REPLACE INTO t3 (id,a)SELECT /*!99997 */ 1;
REPLACE INTO t3 (id,a)SELECT /*!99997 */ 1,2;
SELECT * FROM t3;
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't3'
--source include/wait_condition.inc
--let $wait_condition = SELECT COUNT(*) = 1 FROM test.t3;
--source include/wait_condition.inc
SELECT * FROM t;
SELECT * FROM t2;
SELECT * FROM t3;
--connection node_1
DROP TABLE t,t2,t3;
--echo # Bigger REPLACE ... AS SELECT test
SET GLOBAL wsrep_replicate_myisam=ON;
CREATE TABLE t1(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t2(id int not null primary key ,b int) ENGINE=MyISAM;
CREATE TABLE t3(id int not null primary key ,b int) ENGINE=Aria;
CREATE TABLE t4(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t5(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t6(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t7(id int not null primary key ,b int) ENGINE=MyISAM;
CREATE TABLE t8(id int not null primary key ,b int) ENGINE=Aria;
INSERT INTO t1(id) SELECT seq FROM seq_1_to_1000;
INSERT INTO t2(id) SELECT seq FROM seq_1_to_1000;
INSERT INTO t3(id) SELECT seq FROM seq_1_to_1000;
REPLACE INTO t4 SELECT * FROM t1;
REPLACE INTO t5 SELECT * FROM t2;
# For some reason Aria storage engine does register_ha
--error ER_ERROR_DURING_COMMIT
REPLACE INTO t6 SELECT * FROM t3;
REPLACE INTO t7 SELECT * FROM t2;
REPLACE INTO t8 SELECT * FROM t3;
SELECT COUNT(*) AS EXPECT_1000 FROM t1;
SELECT COUNT(*) AS EXPECT_1000 FROM t2;
SELECT COUNT(*) AS EXPECT_1000 FROM t3;
SELECT COUNT(*) AS EXPECT_1000 FROM t4;
SELECT COUNT(*) AS EXPECT_1000 FROM t5;
SELECT COUNT(*) AS EXPECT_0 FROM t6;
SELECT COUNT(*) AS EXPECT_1000 FROM t7;
SELECT COUNT(*) AS EXPECT_1000 FROM t8;
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 8 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME LIKE 't_'
--source include/wait_condition.inc
--let $wait_condition = SELECT COUNT(*) = 1000 FROM test.t8;
--source include/wait_condition.inc
SELECT COUNT(*) AS EXPECT_1000 FROM t1;
SELECT COUNT(*) AS EXPECT_1000 FROM t2;
SELECT COUNT(*) AS EXPECT_1000 FROM t3;
SELECT COUNT(*) AS EXPECT_1000 FROM t4;
SELECT COUNT(*) AS EXPECT_1000 FROM t5;
SELECT COUNT(*) AS EXPECT_0 FROM t6;
SELECT COUNT(*) AS EXPECT_1000 FROM t7;
SELECT COUNT(*) AS EXPECT_1000 FROM t8;
--connection node_1
DROP TABLE t1,t2,t3,t4,t5,t6,t7,t8;
--echo # Bigger INSERT INTO ... SELECT test
CREATE TABLE t1(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t2(id int not null primary key ,b int) ENGINE=MyISAM;
CREATE TABLE t3(id int not null primary key ,b int) ENGINE=Aria;
CREATE TABLE t4(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t5(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t6(id int not null primary key ,b int) ENGINE=InnoDB;
CREATE TABLE t7(id int not null primary key ,b int) ENGINE=MyISAM;
CREATE TABLE t8(id int not null primary key ,b int) ENGINE=Aria;
INSERT INTO t1(id) SELECT seq FROM seq_1_to_1000;
INSERT INTO t2(id) SELECT seq FROM seq_1_to_1000;
INSERT INTO t3(id) SELECT seq FROM seq_1_to_1000;
INSERT INTO t4 SELECT * FROM t1;
INSERT INTO t5 SELECT * FROM t2;
# For some reason Aria storage engine does register_ha
--error ER_ERROR_DURING_COMMIT
INSERT INTO t6 SELECT * FROM t3;
INSERT INTO t7 SELECT * FROM t2;
INSERT INTO t8 SELECT * FROM t3;
SELECT COUNT(*) AS EXPECT_1000 FROM t1;
SELECT COUNT(*) AS EXPECT_1000 FROM t2;
SELECT COUNT(*) AS EXPECT_1000 FROM t3;
SELECT COUNT(*) AS EXPECT_1000 FROM t4;
SELECT COUNT(*) AS EXPECT_1000 FROM t5;
SELECT COUNT(*) AS EXPECT_0 FROM t6;
SELECT COUNT(*) AS EXPECT_1000 FROM t7;
SELECT COUNT(*) AS EXPECT_1000 FROM t8;
--connection node_2
--let $wait_condition = SELECT COUNT(*) = 8 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME LIKE 't_'
--source include/wait_condition.inc
--let $wait_condition = SELECT COUNT(*) = 1000 FROM test.t8;
--source include/wait_condition.inc
SELECT COUNT(*) AS EXPECT_1000 FROM t1;
SELECT COUNT(*) AS EXPECT_1000 FROM t2;
SELECT COUNT(*) AS EXPECT_1000 FROM t3;
SELECT COUNT(*) AS EXPECT_1000 FROM t4;
SELECT COUNT(*) AS EXPECT_1000 FROM t5;
SELECT COUNT(*) AS EXPECT_0 FROM t6;
SELECT COUNT(*) AS EXPECT_1000 FROM t7;
SELECT COUNT(*) AS EXPECT_1000 FROM t8;
--connection node_1
DROP TABLE t1,t2,t3,t4,t5,t6,t7,t8;
#
# View
#
CREATE TABLE t1(pk int not null primary key) engine=innodb;
INSERT INTO t1 values (1),(2),(3),(4);
CREATE VIEW view_t1 AS SELECT * FROM t1;
INSERT INTO view_t1 VALUES (5);
SELECT * FROM t1;
DROP TABLE t1;
DROP VIEW view_t1;
CREATE TABLE t1(pk int not null primary key) engine=myisam;
INSERT INTO t1 values (1),(2),(3),(4);
CREATE VIEW view_t1 AS SELECT * FROM t1;
INSERT INTO view_t1 VALUES (5);
SELECT * FROM t1;
DROP TABLE t1;
DROP VIEW view_t1;
CREATE TABLE t1(pk int not null primary key) engine=aria;
INSERT INTO t1 values (1),(2),(3),(4);
CREATE VIEW view_t1 AS SELECT * FROM t1;
INSERT INTO view_t1 VALUES (5);
SELECT * FROM t1;
DROP TABLE t1;
DROP VIEW view_t1;
SET GLOBAL wsrep_replicate_myisam=OFF;

View File

@ -1,34 +1,15 @@
--source include/galera_cluster.inc --source include/galera_cluster.inc
--let $node_1 = node_1
--let $node_2 = node_2
--source include/auto_increment_offset_save.inc
--connection node_1 --connection node_1
#
# Below should not cause nodes to be inconsistent (they could if we
# allow TOI as some error are ignored on applier
#
--error ER_NOT_SUPPORTED_YET
CREATE TABLE t ENGINE=InnoDB WITH SYSTEM VERSIONING AS SELECT 1 AS i; CREATE TABLE t ENGINE=InnoDB WITH SYSTEM VERSIONING AS SELECT 1 AS i;
--connection node_2
--error ER_NO_SUCH_TABLE
SHOW CREATE TABLE t; SHOW CREATE TABLE t;
SELECT * from t;
DROP TABLE IF EXISTS t;
COMMIT;
#
# Restart node_2, force SST because database is inconsistent compared to node_1
#
--connection node_2
SET SESSION wsrep_sync_wait=0;
--source include/kill_galera.inc
--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat
--echo Starting server ...
let $restart_noprint=2;
--source include/start_mysqld.inc
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready';
--source include/wait_condition.inc
--connection node_2
call mtr.add_suppression("WSREP: Event .*Write_rows_v1 apply failed:.*");
call mtr.add_suppression("SREP: Failed to apply write set: gtid:.*");
--source include/auto_increment_offset_restore.inc

View File

@ -9,6 +9,7 @@ INSERT INTO t1 VALUES (01), (02), (03), (04), (05);
connection node_2; connection node_2;
Unloading wsrep provider ... Unloading wsrep provider ...
SET GLOBAL wsrep_cluster_address = ''; SET GLOBAL wsrep_cluster_address = '';
connection node_1;
connection node_3; connection node_3;
Unloading wsrep provider ... Unloading wsrep provider ...
SET GLOBAL wsrep_cluster_address = ''; SET GLOBAL wsrep_cluster_address = '';
@ -33,14 +34,16 @@ SET GLOBAL wsrep_provider_options = 'dbug=';
SET GLOBAL wsrep_provider_options = 'signal=ist_sender_send_after_get_buffers'; SET GLOBAL wsrep_provider_options = 'signal=ist_sender_send_after_get_buffers';
INSERT INTO t1 VALUES (51), (52), (53), (54), (55); INSERT INTO t1 VALUES (51), (52), (53), (54), (55);
connection node_2; connection node_2;
connection node_1;
connection node_3; connection node_3;
connection node_1;
connection node_2; connection node_2;
SELECT COUNT(*) = 30 FROM t1; SELECT COUNT(*) AS EXPECT_30 FROM t1;
COUNT(*) = 30 EXPECT_30
1 30
SELECT COUNT(*) = 3 FROM t2; SELECT COUNT(*) AS EXPECT_3 FROM t2;
COUNT(*) = 3 EXPECT_3
1 3
SELECT LENGTH(f1) = 512 * 1024 FROM t2; SELECT LENGTH(f1) = 512 * 1024 FROM t2;
LENGTH(f1) = 512 * 1024 LENGTH(f1) = 512 * 1024
1 1
@ -48,12 +51,12 @@ LENGTH(f1) = 512 * 1024
1 1
CALL mtr.add_suppression("WSREP: Unsupported protocol downgrade: incremental data collection disabled"); CALL mtr.add_suppression("WSREP: Unsupported protocol downgrade: incremental data collection disabled");
connection node_3; connection node_3;
SELECT COUNT(*) = 30 FROM t1; SELECT COUNT(*) AS EXPECT_30 FROM t1;
COUNT(*) = 30 EXPECT_30
1 30
SELECT COUNT(*) = 3 FROM t2; SELECT COUNT(*) AS EXPECT_3 FROM t2;
COUNT(*) = 3 EXPECT_3
1 3
SELECT LENGTH(f1) = 512 * 1024 FROM t2; SELECT LENGTH(f1) = 512 * 1024 FROM t2;
LENGTH(f1) = 512 * 1024 LENGTH(f1) = 512 * 1024
1 1

View File

@ -92,3 +92,7 @@ connection node_2;
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
connection node_3; connection node_3;
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
disconnect node_1a;
disconnect node_3;
disconnect node_2;
disconnect node_1;

View File

@ -2,10 +2,22 @@
[mysqld.1] [mysqld.1]
wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.ignore_sb=true;gcache.size=1M' wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.ignore_sb=true;gcache.size=1M'
auto_increment_increment=1
auto_increment_offset=1
# this will force server restarts before this test
loose-galera-ist-gcache-rollover=1
wsrep-debug=1
[mysqld.2] [mysqld.2]
wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.2.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.ignore_sb=true;gcache.size=1M' wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.2.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.ignore_sb=true;gcache.size=1M'
auto_increment_increment=2
auto_increment_offset=2
loose-galera-ist-gcache-rollover=2
wsrep-debug=1
[mysqld.3] [mysqld.3]
wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.3.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.ignore_sb=true;gcache.size=1M' wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.3.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.ignore_sb=true;gcache.size=1M'
auto_increment_increment=3
auto_increment_offset=3
loose-galera-ist-gcache-rollover=3
wsrep-debug=1

View File

@ -12,6 +12,7 @@
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/have_debug_sync.inc --source include/have_debug_sync.inc
--source include/galera_have_debug_sync.inc --source include/galera_have_debug_sync.inc
--source include/force_restart.inc
--let $galera_connection_name = node_3 --let $galera_connection_name = node_3
--let $galera_server_number = 3 --let $galera_server_number = 3
@ -24,6 +25,9 @@
--source ../galera/include/auto_increment_offset_save.inc --source ../galera/include/auto_increment_offset_save.inc
--connection node_1 --connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--let $wait_condition_on_error_output = SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE 'wsrep%'; show processlist
--source include/wait_condition_with_debug.inc
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); CREATE TABLE t1 (f1 INTEGER PRIMARY KEY);
INSERT INTO t1 VALUES (01), (02), (03), (04), (05); INSERT INTO t1 VALUES (01), (02), (03), (04), (05);
@ -32,12 +36,15 @@ INSERT INTO t1 VALUES (01), (02), (03), (04), (05);
--let $wsrep_cluster_address_orig2 = `select @@wsrep_cluster_address` --let $wsrep_cluster_address_orig2 = `select @@wsrep_cluster_address`
--source suite/galera/include/galera_stop_replication.inc --source suite/galera/include/galera_stop_replication.inc
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
--connection node_3 --connection node_3
--let $wsrep_cluster_address_orig3 = `select @@wsrep_cluster_address` --let $wsrep_cluster_address_orig3 = `select @@wsrep_cluster_address`
--source suite/galera/include/galera_stop_replication.inc --source suite/galera/include/galera_stop_replication.inc
--connection node_1 --connection node_1
--source include/wait_until_connected_again.inc
INSERT INTO t1 VALUES (11), (12), (13), (14), (15); INSERT INTO t1 VALUES (11), (12), (13), (14), (15);
# Wait until nodes #2 and #3 have left # Wait until nodes #2 and #3 have left
@ -88,29 +95,39 @@ INSERT INTO t1 VALUES (51), (52), (53), (54), (55);
--connection node_2 --connection node_2
--source include/wait_until_connected_again.inc --source include/wait_until_connected_again.inc
--connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 2 OR VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
--connection node_3 --connection node_3
--source include/wait_until_connected_again.inc --source include/wait_until_connected_again.inc
sleep 5; --connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'
--source include/wait_condition.inc
# Final checks # Final checks
--connection node_2 --connection node_2
SELECT COUNT(*) = 30 FROM t1; --let $wait_condition = SELECT COUNT(*) = 30 FROM t1
SELECT COUNT(*) = 3 FROM t2; --source include/wait_condition.inc
SELECT COUNT(*) AS EXPECT_30 FROM t1;
SELECT COUNT(*) AS EXPECT_3 FROM t2;
SELECT LENGTH(f1) = 512 * 1024 FROM t2; SELECT LENGTH(f1) = 512 * 1024 FROM t2;
CALL mtr.add_suppression("WSREP: Unsupported protocol downgrade: incremental data collection disabled"); CALL mtr.add_suppression("WSREP: Unsupported protocol downgrade: incremental data collection disabled");
# Final checks # Final checks
--connection node_3 --connection node_3
SELECT COUNT(*) = 30 FROM t1; --let $wait_condition = SELECT COUNT(*) = 30 FROM t1
SELECT COUNT(*) = 3 FROM t2; --source include/wait_condition.inc
SELECT COUNT(*) AS EXPECT_30 FROM t1;
SELECT COUNT(*) AS EXPECT_3 FROM t2;
SELECT LENGTH(f1) = 512 * 1024 FROM t2; SELECT LENGTH(f1) = 512 * 1024 FROM t2;
CALL mtr.add_suppression("WSREP: Unsupported protocol downgrade: incremental data collection disabled"); CALL mtr.add_suppression("WSREP: Unsupported protocol downgrade: incremental data collection disabled");
DROP TABLE t1, t2; DROP TABLE t1, t2;
# Restore original auto_increment_offset values. # Restore original auto_increment_offset values.
--source ../galera/include/auto_increment_offset_restore.inc
--let $galera_cluster_size=3 --let $galera_cluster_size=3
--source ../galera/include/auto_increment_offset_restore.inc
--source include/galera_end.inc --source include/galera_end.inc

View File

@ -278,4 +278,9 @@ call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State T
--connection node_3 --connection node_3
call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required.");
--disconnect node_1a
# Restore original auto_increment_offset values.
--let $galera_cluster_size=3
--source ../galera/include/auto_increment_offset_restore.inc --source ../galera/include/auto_increment_offset_restore.inc
--source include/galera_end.inc

View File

@ -7,11 +7,11 @@ connection node_3;
connection node_1; connection node_1;
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
connection node_2; connection node_2;
SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) AS EXPECT_0 FROM t1;
COUNT(*) = 0 EXPECT_0
1 0
connection node_1; connection node_1;
CREATE TABLE t2 (f1 INTEGER); CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2;
LOCK TABLE t2 WRITE; LOCK TABLE t2 WRITE;
connection node_1; connection node_1;
@ -37,12 +37,12 @@ count_match
count_match count_match
1 1
connection node_1; connection node_1;
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
COUNT(*) EXPECT_0
0 0
connection node_2; connection node_2;
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
COUNT(*) EXPECT_0
0 0
connection node_1; connection node_1;
DROP TABLE t1; DROP TABLE t1;

View File

@ -15,18 +15,23 @@
--source ../galera/include/auto_increment_offset_save.inc --source ../galera/include/auto_increment_offset_save.inc
--connection node_1 --connection node_1
--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size';
--source include/wait_condition.inc
CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
# Block node #2's applier before table t1's inserts have come into play # Block node #2's applier before table t1's inserts have come into play
--connection node_2 --connection node_2
SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) AS EXPECT_0 FROM t1;
--connection node_1 --connection node_1
CREATE TABLE t2 (f1 INTEGER); CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2
--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'
--source include/wait_condition.inc
LOCK TABLE t2 WRITE; LOCK TABLE t2 WRITE;
--connection node_1 --connection node_1
@ -77,10 +82,10 @@ if ($mysql_errno == 1213) {
--enable_query_log --enable_query_log
--connection node_1 --connection node_1
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
--connection node_2 --connection node_2
SELECT COUNT(*) FROM mysql.wsrep_streaming_log; SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
--connection node_1 --connection node_1
DROP TABLE t1; DROP TABLE t1;

View File

@ -11,6 +11,22 @@ ERROR HY000: Schema mismatch (ROW_FORMAT mismatch)
DROP TABLE imp_t1, t1; DROP TABLE imp_t1, t1;
SET GLOBAL innodb_checksum_algorithm=@save_innodb_checksum_algorithm; SET GLOBAL innodb_checksum_algorithm=@save_innodb_checksum_algorithm;
# #
# MDEV-33400 Adaptive hash index corruption after DISCARD TABLESPACE
#
SET @save_adaptive=@@GLOBAL.innodb_adaptive_hash_index;
SET GLOBAL innodb_adaptive_hash_index=ON;
CREATE TABLE t (a INT PRIMARY KEY) ENGINE=INNODB;
INSERT INTO t SELECT * FROM seq_1_to_131;
ALTER TABLE t ADD hid INT DEFAULT 2;
INSERT INTO t VALUES (251,1);
ALTER TABLE t DISCARD TABLESPACE;
CHECK TABLE mysql.innodb_table_stats;
Table Op Msg_type Msg_text
mysql.innodb_table_stats check status OK
DROP TABLE t;
SET GLOBAL innodb_adaptive_hash_index=@save_adaptive;
# End of 10.4 tests
#
# MDEV-18288: Transportable Tablespaces leave AUTO_INCREMENT in mismatched # MDEV-18288: Transportable Tablespaces leave AUTO_INCREMENT in mismatched
# state, causing INSERT errors in newly imported tables when .cfg is not used. # state, causing INSERT errors in newly imported tables when .cfg is not used.
# #
@ -45,3 +61,4 @@ id
4 4
5 5
DROP TABLE t2; DROP TABLE t2;
# End of 10.5 tests

View File

@ -1,4 +1,5 @@
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/have_sequence.inc
call mtr.add_suppression("Index for table 'imp_t1' is corrupt; try to repair it"); call mtr.add_suppression("Index for table 'imp_t1' is corrupt; try to repair it");
@ -18,6 +19,24 @@ DROP TABLE imp_t1, t1;
SET GLOBAL innodb_checksum_algorithm=@save_innodb_checksum_algorithm; SET GLOBAL innodb_checksum_algorithm=@save_innodb_checksum_algorithm;
--echo #
--echo # MDEV-33400 Adaptive hash index corruption after DISCARD TABLESPACE
--echo #
SET @save_adaptive=@@GLOBAL.innodb_adaptive_hash_index;
SET GLOBAL innodb_adaptive_hash_index=ON;
CREATE TABLE t (a INT PRIMARY KEY) ENGINE=INNODB;
INSERT INTO t SELECT * FROM seq_1_to_131;
ALTER TABLE t ADD hid INT DEFAULT 2;
INSERT INTO t VALUES (251,1);
ALTER TABLE t DISCARD TABLESPACE;
CHECK TABLE mysql.innodb_table_stats;
DROP TABLE t;
SET GLOBAL innodb_adaptive_hash_index=@save_adaptive;
--echo # End of 10.4 tests
--echo # --echo #
--echo # MDEV-18288: Transportable Tablespaces leave AUTO_INCREMENT in mismatched --echo # MDEV-18288: Transportable Tablespaces leave AUTO_INCREMENT in mismatched
--echo # state, causing INSERT errors in newly imported tables when .cfg is not used. --echo # state, causing INSERT errors in newly imported tables when .cfg is not used.
@ -58,3 +77,5 @@ INSERT INTO t2() VALUES();
SELECT * FROM t2 ORDER BY id; SELECT * FROM t2 ORDER BY id;
DROP TABLE t2; DROP TABLE t2;
--echo # End of 10.5 tests

View File

@ -60,7 +60,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -521,7 +520,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -993,7 +991,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -1466,7 +1463,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -1933,7 +1929,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -2406,7 +2401,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -2884,7 +2878,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -3360,7 +3353,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -3826,7 +3818,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -4287,7 +4278,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -4759,7 +4749,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -5232,7 +5221,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -5699,7 +5687,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -6172,7 +6159,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -6650,7 +6636,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -7126,7 +7111,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -15108,7 +15092,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -15569,7 +15552,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -16041,7 +16023,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -16514,7 +16495,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -16981,7 +16961,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -17454,7 +17433,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -17932,7 +17910,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -18408,7 +18385,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template

View File

@ -60,7 +60,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -530,7 +529,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -1017,7 +1015,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -1511,7 +1508,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -1995,7 +1991,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -2489,7 +2484,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -2988,7 +2982,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -3485,7 +3478,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1; ALTER TABLE t1 ANALYZE PARTITION part_1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -3974,7 +3966,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -4444,7 +4435,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -4931,7 +4921,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -5425,7 +5414,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -5909,7 +5897,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -6403,7 +6390,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -6902,7 +6888,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -7399,7 +7384,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -15700,7 +15684,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -16170,7 +16153,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -16657,7 +16639,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -17151,7 +17132,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -17635,7 +17615,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -18129,7 +18108,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -18628,7 +18606,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
@ -19125,7 +19102,6 @@ SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template
WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1;
ALTER TABLE t1 ANALYZE PARTITION ALL; ALTER TABLE t1 ANALYZE PARTITION ALL;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig)
SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template

View File

@ -1020,7 +1020,6 @@ a b
2001 Second in MAX 2001 Second in MAX
ALTER TABLE t1 ANALYZE PARTITION MAX; ALTER TABLE t1 ANALYZE PARTITION MAX;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
MySQL_Test_DB.t1 analyze status Engine-independent statistics collected
MySQL_Test_DB.t1 analyze status OK MySQL_Test_DB.t1 analyze status OK
# Truncate without FLUSH # Truncate without FLUSH
ALTER TABLE t1 TRUNCATE PARTITION MAX; ALTER TABLE t1 TRUNCATE PARTITION MAX;

View File

@ -1020,7 +1020,6 @@ a b
2001 Second in MAX 2001 Second in MAX
ALTER TABLE t1 ANALYZE PARTITION MAX; ALTER TABLE t1 ANALYZE PARTITION MAX;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
MySQL_Test_DB.t1 analyze status Engine-independent statistics collected
MySQL_Test_DB.t1 analyze note The storage engine for the table doesn't support analyze MySQL_Test_DB.t1 analyze note The storage engine for the table doesn't support analyze
# Truncate without FLUSH # Truncate without FLUSH
ALTER TABLE t1 TRUNCATE PARTITION MAX; ALTER TABLE t1 TRUNCATE PARTITION MAX;

View File

@ -1020,7 +1020,6 @@ a b
2001 Second in MAX 2001 Second in MAX
ALTER TABLE t1 ANALYZE PARTITION MAX; ALTER TABLE t1 ANALYZE PARTITION MAX;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
MySQL_Test_DB.t1 analyze status Engine-independent statistics collected
MySQL_Test_DB.t1 analyze status OK MySQL_Test_DB.t1 analyze status OK
# Truncate without FLUSH # Truncate without FLUSH
ALTER TABLE t1 TRUNCATE PARTITION MAX; ALTER TABLE t1 TRUNCATE PARTITION MAX;

View File

@ -987,7 +987,6 @@ a b
2001 Second in MAX 2001 Second in MAX
ALTER TABLE t1 ANALYZE PARTITION MAX; ALTER TABLE t1 ANALYZE PARTITION MAX;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
mysql_test_db.t1 analyze status Engine-independent statistics collected
mysql_test_db.t1 analyze status OK mysql_test_db.t1 analyze status OK
# Truncate without FLUSH # Truncate without FLUSH
ALTER TABLE t1 TRUNCATE PARTITION MAX; ALTER TABLE t1 TRUNCATE PARTITION MAX;

View File

@ -987,7 +987,6 @@ a b
2001 Second in MAX 2001 Second in MAX
ALTER TABLE t1 ANALYZE PARTITION MAX; ALTER TABLE t1 ANALYZE PARTITION MAX;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
mysql_test_db.t1 analyze status Engine-independent statistics collected
mysql_test_db.t1 analyze note The storage engine for the table doesn't support analyze mysql_test_db.t1 analyze note The storage engine for the table doesn't support analyze
# Truncate without FLUSH # Truncate without FLUSH
ALTER TABLE t1 TRUNCATE PARTITION MAX; ALTER TABLE t1 TRUNCATE PARTITION MAX;

View File

@ -987,7 +987,6 @@ a b
2001 Second in MAX 2001 Second in MAX
ALTER TABLE t1 ANALYZE PARTITION MAX; ALTER TABLE t1 ANALYZE PARTITION MAX;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
mysql_test_db.t1 analyze status Engine-independent statistics collected
mysql_test_db.t1 analyze status OK mysql_test_db.t1 analyze status OK
# Truncate without FLUSH # Truncate without FLUSH
ALTER TABLE t1 TRUNCATE PARTITION MAX; ALTER TABLE t1 TRUNCATE PARTITION MAX;

View File

@ -55,7 +55,6 @@ PARTITION pmax VALUES LESS THAN (MAXVALUE));
INSERT INTO t1 VALUES (1), (10), (100), (1000); INSERT INTO t1 VALUES (1), (10), (100), (1000);
ALTER TABLE t1 ANALYZE PARTITION p0; ALTER TABLE t1 ANALYZE PARTITION p0;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
ALTER TABLE t1 OPTIMIZE PARTITION p0; ALTER TABLE t1 OPTIMIZE PARTITION p0;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text

View File

@ -1430,6 +1430,9 @@ bool Field::sp_prepare_and_store_item(THD *thd, Item **value)
if (!(expr_item= thd->sp_prepare_func_item(value, 1))) if (!(expr_item= thd->sp_prepare_func_item(value, 1)))
goto error; goto error;
if (expr_item->check_is_evaluable_expression_or_error())
goto error;
/* /*
expr_item is now fixed, it's safe to call cmp_type() expr_item is now fixed, it's safe to call cmp_type()
*/ */
@ -11253,6 +11256,30 @@ bool Field::validate_value_in_record_with_warn(THD *thd, const uchar *record)
} }
/**
Find which reaction should be for IGNORE value.
*/
ignore_value_reaction find_ignore_reaction(THD *thd)
{
enum_sql_command com= thd->lex->sql_command;
// All insert-like commands
if (com == SQLCOM_INSERT || com == SQLCOM_REPLACE ||
com == SQLCOM_INSERT_SELECT || com == SQLCOM_REPLACE_SELECT ||
com == SQLCOM_LOAD)
{
return IGNORE_MEANS_DEFAULT;
}
// Update commands
if (com == SQLCOM_UPDATE || com == SQLCOM_UPDATE_MULTI)
{
return IGNORE_MEANS_FIELD_VALUE;
}
return IGNORE_MEANS_ERROR;
}
bool Field::save_in_field_default_value(bool view_error_processing) bool Field::save_in_field_default_value(bool view_error_processing)
{ {
THD *thd= table->in_use; THD *thd= table->in_use;

View File

@ -63,6 +63,15 @@ enum enum_check_fields
CHECK_FIELD_ERROR_FOR_NULL, CHECK_FIELD_ERROR_FOR_NULL,
}; };
enum ignore_value_reaction
{
IGNORE_MEANS_ERROR,
IGNORE_MEANS_DEFAULT,
IGNORE_MEANS_FIELD_VALUE
};
ignore_value_reaction find_ignore_reaction(THD *thd);
enum enum_conv_type enum enum_conv_type
{ {

View File

@ -1739,12 +1739,17 @@ int ha_commit_trans(THD *thd, bool all)
// Issue a message to the client and roll back the transaction. // Issue a message to the client and roll back the transaction.
if (trans->no_2pc && rw_ha_count > 1) if (trans->no_2pc && rw_ha_count > 1)
{ {
my_message(ER_ERROR_DURING_COMMIT, "Transactional commit not supported " // REPLACE|INSERT INTO ... SELECT uses TOI for MyISAM|Aria
"by involved engine(s)", MYF(0)); if (WSREP(thd) && thd->wsrep_cs().mode() != wsrep::client_state::m_toi)
error= 1; {
my_message(ER_ERROR_DURING_COMMIT, "Transactional commit not supported "
"by involved engine(s)", MYF(0));
error= 1;
}
} }
else
error= wsrep_before_commit(thd, all); if (!error)
error= wsrep_before_commit(thd, all);
} }
if (error) if (error)
{ {
@ -2091,8 +2096,12 @@ int ha_rollback_trans(THD *thd, bool all)
} }
#ifdef WITH_WSREP #ifdef WITH_WSREP
(void) wsrep_before_rollback(thd, all); // REPLACE|INSERT INTO ... SELECT uses TOI in consistency check
if (thd->wsrep_consistency_check != CONSISTENCY_CHECK_RUNNING)
if (thd->wsrep_cs().mode() != wsrep::client_state::m_toi)
(void) wsrep_before_rollback(thd, all);
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
if (ha_info) if (ha_info)
{ {
/* Close all cursors that can not survive ROLLBACK */ /* Close all cursors that can not survive ROLLBACK */
@ -2129,7 +2138,11 @@ int ha_rollback_trans(THD *thd, bool all)
thd->thread_id, all?"TRUE":"FALSE", wsrep_thd_query(thd), thd->thread_id, all?"TRUE":"FALSE", wsrep_thd_query(thd),
thd->get_stmt_da()->message(), is_real_trans); thd->get_stmt_da()->message(), is_real_trans);
} }
(void) wsrep_after_rollback(thd, all);
// REPLACE|INSERT INTO ... SELECT uses TOI in consistency check
if (thd->wsrep_consistency_check != CONSISTENCY_CHECK_RUNNING)
if (thd->wsrep_cs().mode() != wsrep::client_state::m_toi)
(void) wsrep_after_rollback(thd, all);
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
if (all || !thd->in_active_multi_stmt_transaction()) if (all || !thd->in_active_multi_stmt_transaction())

View File

@ -4059,7 +4059,9 @@ Item_param::Item_param(THD *thd, const LEX_CSTRING *name_arg,
as an actual parameter. See Item_param::set_from_item(). as an actual parameter. See Item_param::set_from_item().
*/ */
m_is_settable_routine_parameter(true), m_is_settable_routine_parameter(true),
m_clones(thd->mem_root) m_clones(thd->mem_root),
m_associated_field(nullptr),
m_default_field(nullptr)
{ {
name= *name_arg; name= *name_arg;
/* /*
@ -4465,10 +4467,29 @@ int Item_param::save_in_field(Field *field, bool no_conversions)
case NULL_VALUE: case NULL_VALUE:
return set_field_to_null_with_conversions(field, no_conversions); return set_field_to_null_with_conversions(field, no_conversions);
case DEFAULT_VALUE: case DEFAULT_VALUE:
if (m_associated_field)
return assign_default(field);
return field->save_in_field_default_value(field->table->pos_in_table_list-> return field->save_in_field_default_value(field->table->pos_in_table_list->
top_table() != top_table() !=
field->table->pos_in_table_list); field->table->pos_in_table_list);
case IGNORE_VALUE: case IGNORE_VALUE:
if (m_associated_field)
{
switch (find_ignore_reaction(field->table->in_use))
{
case IGNORE_MEANS_DEFAULT:
DBUG_ASSERT(0); // impossible now, but fully working code if needed
return assign_default(field);
case IGNORE_MEANS_FIELD_VALUE:
m_associated_field->save_val(field);
return false;
default:
; // fall through to error
}
DBUG_ASSERT(0); //impossible
my_error(ER_INVALID_DEFAULT_PARAM, MYF(0));
return true;
}
return field->save_in_field_ignore_value(field->table->pos_in_table_list-> return field->save_in_field_ignore_value(field->table->pos_in_table_list->
top_table() != top_table() !=
field->table->pos_in_table_list); field->table->pos_in_table_list);
@ -5036,6 +5057,82 @@ bool Item_param::append_for_log(THD *thd, String *str)
} }
/**
Allocate a memory and create on it a copy of Field object.
@param thd thread handler
@param field_arg an instance of Field the new Field object be based on
@return a new created Field object on success, nullptr on error.
*/
static Field *make_default_field(THD *thd, Field *field_arg)
{
Field *def_field;
if (!(def_field= (Field*) thd->alloc(field_arg->size_of())))
return nullptr;
memcpy((void *)def_field, (void *)field_arg, field_arg->size_of());
def_field->reset_fields();
// If non-constant default value expression or a blob
if (def_field->default_value &&
(def_field->default_value->flags || (def_field->flags & BLOB_FLAG)))
{
uchar *newptr= (uchar*) thd->alloc(1+def_field->pack_length());
if (!newptr)
return nullptr;
if (should_mark_column(thd->column_usage))
def_field->default_value->expr->update_used_tables();
def_field->move_field(newptr + 1, def_field->maybe_null() ? newptr : 0, 1);
}
else
def_field->move_field_offset((my_ptrdiff_t)
(def_field->table->s->default_values -
def_field->table->record[0]));
return def_field;
}
/**
Assign a default value of a table column to the positional parameter that
is performed on execution of a prepared statement with the clause
'USING DEFAULT'
@param field a field that should be assigned an actual value of positional
parameter passed via the clause 'USING DEFAULT'
@return false on success, true on failure
*/
bool Item_param::assign_default(Field *field)
{
DBUG_ASSERT(m_associated_field);
if (m_associated_field->field->flags & NO_DEFAULT_VALUE_FLAG)
{
my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0),
m_associated_field->field->field_name.str);
return true;
}
if (!m_default_field)
{
m_default_field= make_default_field(field->table->in_use,
m_associated_field->field);
if (!m_default_field)
return true;
}
if (m_default_field->default_value)
m_default_field->set_default();
return field_conv(field, m_default_field);
}
/**************************************************************************** /****************************************************************************
Item_copy_string Item_copy_string
****************************************************************************/ ****************************************************************************/
@ -9518,69 +9615,10 @@ bool Item_default_value::update_func_default_processor(void *)
bool Item_default_value::fix_fields(THD *thd, Item **items) bool Item_default_value::fix_fields(THD *thd, Item **items)
{ {
Item *real_arg;
Item_field *field_arg;
Field *def_field;
DBUG_ASSERT(fixed == 0); DBUG_ASSERT(fixed == 0);
DBUG_ASSERT(arg); DBUG_ASSERT(arg);
/* return tie_field(thd);
DEFAULT() do not need table field so should not ask handler to bring
field value (mark column for read)
*/
enum_column_usage save_column_usage= thd->column_usage;
/*
Fields which has defult value could be read, so it is better hide system
invisible columns.
*/
thd->column_usage= COLUMNS_WRITE;
if (arg->fix_fields_if_needed(thd, &arg))
{
thd->column_usage= save_column_usage;
goto error;
}
thd->column_usage= save_column_usage;
real_arg= arg->real_item();
if (real_arg->type() != FIELD_ITEM)
{
my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), arg->name.str);
goto error;
}
field_arg= (Item_field *)real_arg;
if ((field_arg->field->flags & NO_DEFAULT_VALUE_FLAG))
{
my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0),
field_arg->field->field_name.str);
goto error;
}
if (!(def_field= (Field*) thd->alloc(field_arg->field->size_of())))
goto error;
memcpy((void *)def_field, (void *)field_arg->field,
field_arg->field->size_of());
def_field->reset_fields();
// If non-constant default value expression or a blob
if (def_field->default_value &&
(def_field->default_value->flags || (def_field->flags & BLOB_FLAG)))
{
uchar *newptr= (uchar*) thd->alloc(1+def_field->pack_length());
if (!newptr)
goto error;
if (should_mark_column(thd->column_usage))
def_field->default_value->expr->update_used_tables();
def_field->move_field(newptr+1, def_field->maybe_null() ? newptr : 0, 1);
}
else
def_field->move_field_offset((my_ptrdiff_t)
(def_field->table->s->default_values -
def_field->table->record[0]));
set_field(def_field);
return FALSE;
error:
context->process_error(thd);
return TRUE;
} }
void Item_default_value::cleanup() void Item_default_value::cleanup()
@ -9769,6 +9807,75 @@ Item *Item_default_value::transform(THD *thd, Item_transformer transformer,
} }
bool Item_default_value::associate_with_target_field(THD *thd,
Item_field *field)
{
m_associated= true;
arg= field;
return tie_field(thd);
}
/**
Call fix_fields for an item representing the default value, create
an instance of Field for representing the default value and assign it
to the Item_field::field.
@param thd thread handler
@return false on success, true on error
*/
bool Item_default_value::tie_field(THD *thd)
{
Item *real_arg;
Item_field *field_arg;
Field *def_field;
/*
DEFAULT() do not need table field so should not ask handler to bring
field value (mark column for read)
*/
enum_column_usage save_column_usage= thd->column_usage;
/*
Fields which has defult value could be read, so it is better hide system
invisible columns.
*/
thd->column_usage= COLUMNS_WRITE;
if (arg->fix_fields_if_needed(thd, &arg))
{
thd->column_usage= save_column_usage;
goto error;
}
thd->column_usage= save_column_usage;
real_arg= arg->real_item();
if (real_arg->type() != FIELD_ITEM)
{
my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), arg->name.str);
goto error;
}
field_arg= (Item_field *)real_arg;
if ((field_arg->field->flags & NO_DEFAULT_VALUE_FLAG))
{
my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0),
field_arg->field->field_name.str);
goto error;
}
def_field= make_default_field(thd, field_arg->field);
if (!def_field)
goto error;
set_field(def_field);
return false;
error:
context->process_error(thd);
return true;
}
bool Item_insert_value::eq(const Item *item, bool binary_cmp) const bool Item_insert_value::eq(const Item *item, bool binary_cmp) const
{ {
return item->type() == INSERT_VALUE_ITEM && return item->type() == INSERT_VALUE_ITEM &&

View File

@ -846,7 +846,7 @@ protected:
const Tmp_field_param *param, const Tmp_field_param *param,
bool is_explicit_null); bool is_explicit_null);
void raise_error_not_evaluable(); virtual void raise_error_not_evaluable();
void push_note_converted_to_negative_complement(THD *thd); void push_note_converted_to_negative_complement(THD *thd);
void push_note_converted_to_positive_complement(THD *thd); void push_note_converted_to_positive_complement(THD *thd);
@ -2515,6 +2515,18 @@ public:
Checks if this item consists in the left part of arg IN subquery predicate Checks if this item consists in the left part of arg IN subquery predicate
*/ */
bool pushable_equality_checker_for_subquery(uchar *arg); bool pushable_equality_checker_for_subquery(uchar *arg);
/**
This method is to set relationship between a positional parameter
represented by the '?' and an actual argument value passed to the
call of PS/SP by the USING clause. The method is overridden in classes
Item_param and Item_default_value.
*/
virtual bool associate_with_target_field(THD *, Item_field *)
{
DBUG_ASSERT(is_fixed());
return false;
}
}; };
MEM_ROOT *get_thd_memroot(THD *thd); MEM_ROOT *get_thd_memroot(THD *thd);
@ -4187,6 +4199,10 @@ public:
void sync_clones(); void sync_clones();
bool register_clone(Item_param *i) { return m_clones.push_back(i); } bool register_clone(Item_param *i) { return m_clones.push_back(i); }
void raise_error_not_evaluable() override
{
invalid_default_param();
}
private: private:
void invalid_default_param() const; void invalid_default_param() const;
@ -4201,6 +4217,17 @@ public:
void make_send_field(THD *thd, Send_field *field) override; void make_send_field(THD *thd, Send_field *field) override;
/**
See comments on @see Item::associate_with_target_field for method
description
*/
bool associate_with_target_field(THD *, Item_field *field) override
{
m_associated_field= field;
return false;
}
bool assign_default(Field *field);
private: private:
Send_field *m_out_param_info; Send_field *m_out_param_info;
bool m_is_settable_routine_parameter; bool m_is_settable_routine_parameter;
@ -4210,6 +4237,8 @@ private:
synchronize the actual value of the parameter with the values of the clones. synchronize the actual value of the parameter with the values of the clones.
*/ */
Mem_root_array<Item_param *, true> m_clones; Mem_root_array<Item_param *, true> m_clones;
Item_field *m_associated_field;
Field *m_default_field;
}; };
@ -6485,6 +6514,8 @@ public:
class Item_default_value : public Item_field class Item_default_value : public Item_field
{ {
bool vcol_assignment_ok; bool vcol_assignment_ok;
bool m_associated= false;
void calculate(); void calculate();
public: public:
Item *arg= nullptr; Item *arg= nullptr;
@ -6555,6 +6586,15 @@ public:
override; override;
Field *create_tmp_field_ex(MEM_ROOT *root, TABLE *table, Tmp_field_src *src, Field *create_tmp_field_ex(MEM_ROOT *root, TABLE *table, Tmp_field_src *src,
const Tmp_field_param *param) override; const Tmp_field_param *param) override;
/**
See comments on @see Item::associate_with_target_field for method
description
*/
bool associate_with_target_field(THD *thd, Item_field *field) override;
private:
bool tie_field(THD *thd);
}; };

View File

@ -1195,15 +1195,8 @@ MDL_wait::timed_wait(MDL_context_owner *owner, struct timespec *abs_timeout,
{ {
#ifdef WITH_WSREP #ifdef WITH_WSREP
# ifdef ENABLED_DEBUG_SYNC # ifdef ENABLED_DEBUG_SYNC
// Allow tests to block the applier thread using the DBUG facilities // Allow tests to block thread before MDL-wait
DBUG_EXECUTE_IF("sync.wsrep_before_mdl_wait", DEBUG_SYNC(owner->get_thd(), "wsrep_before_mdl_wait");
{
const char act[]=
"now "
"wait_for signal.wsrep_before_mdl_wait";
DBUG_ASSERT(!debug_sync_set_action((owner->get_thd()),
STRING_WITH_LEN(act)));
};);
# endif # endif
if (WSREP_ON && wsrep_thd_is_BF(owner->get_thd(), false)) if (WSREP_ON && wsrep_thd_is_BF(owner->get_thd(), false))
{ {

View File

@ -863,7 +863,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
*/ */
collect_eis= collect_eis=
(table->table->s->table_category == TABLE_CATEGORY_USER && (table->table->s->table_category == TABLE_CATEGORY_USER &&
!(lex->alter_info.flags & ALTER_PARTITION_ADMIN) && !(lex->alter_info.partition_flags & ALTER_PARTITION_ADMIN) &&
(check_eits_collection_allowed(thd) || (check_eits_collection_allowed(thd) ||
lex->with_persistent_for_clause)); lex->with_persistent_for_clause));
} }

View File

@ -8807,6 +8807,9 @@ fill_record_n_invoke_before_triggers(THD *thd, TABLE *table,
@param values values to fill with @param values values to fill with
@param ignore_errors TRUE if we should ignore errors @param ignore_errors TRUE if we should ignore errors
@param use_value forces usage of value of the items instead of result @param use_value forces usage of value of the items instead of result
@param check_for_computability whether to check for ability to invoke val_*()
methods (val_int () etc) against supplied
values
@details @details
fill_record() may set table->auto_increment_field_not_null and a fill_record() may set table->auto_increment_field_not_null and a
@ -8820,7 +8823,7 @@ fill_record_n_invoke_before_triggers(THD *thd, TABLE *table,
bool bool
fill_record(THD *thd, TABLE *table, Field **ptr, List<Item> &values, fill_record(THD *thd, TABLE *table, Field **ptr, List<Item> &values,
bool ignore_errors, bool use_value) bool ignore_errors, bool use_value, bool check_for_computability)
{ {
List_iterator_fast<Item> v(values); List_iterator_fast<Item> v(values);
List<TABLE> tbl_list; List<TABLE> tbl_list;
@ -8858,6 +8861,10 @@ fill_record(THD *thd, TABLE *table, Field **ptr, List<Item> &values,
value=v++; value=v++;
if (check_for_computability &&
value->check_is_evaluable_expression_or_error())
goto err;
bool vers_sys_field= table->versioned() && field->vers_sys_field(); bool vers_sys_field= table->versioned() && field->vers_sys_field();
if (field->field_index == autoinc_index) if (field->field_index == autoinc_index)
@ -8932,7 +8939,7 @@ fill_record_n_invoke_before_triggers(THD *thd, TABLE *table, Field **ptr,
bool result; bool result;
Table_triggers_list *triggers= table->triggers; Table_triggers_list *triggers= table->triggers;
result= fill_record(thd, table, ptr, values, ignore_errors, FALSE); result= fill_record(thd, table, ptr, values, ignore_errors, false, false);
if (!result && triggers && *ptr) if (!result && triggers && *ptr)
result= triggers->process_triggers(thd, event, TRG_ACTION_BEFORE, TRUE) || result= triggers->process_triggers(thd, event, TRG_ACTION_BEFORE, TRUE) ||

View File

@ -190,7 +190,8 @@ void unfix_fields(List<Item> &items);
bool fill_record(THD * thd, TABLE *table_arg, List<Item> &fields, bool fill_record(THD * thd, TABLE *table_arg, List<Item> &fields,
List<Item> &values, bool ignore_errors, bool update); List<Item> &values, bool ignore_errors, bool update);
bool fill_record(THD *thd, TABLE *table, Field **field, List<Item> &values, bool fill_record(THD *thd, TABLE *table, Field **field, List<Item> &values,
bool ignore_errors, bool use_value); bool ignore_errors, bool use_value,
bool check_for_evaluability);
Field * Field *
find_field_in_tables(THD *thd, Item_ident *item, find_field_in_tables(THD *thd, Item_ident *item,

View File

@ -271,7 +271,8 @@ my_bool Expression_cache_tmptable::put_value(Item *value)
} }
*(items.head_ref())= value; *(items.head_ref())= value;
fill_record(table_thd, cache_table, cache_table->field, items, TRUE, TRUE); fill_record(table_thd, cache_table, cache_table->field, items, true, true,
true);
if (unlikely(table_thd->is_error())) if (unlikely(table_thd->is_error()))
goto err;; goto err;;

View File

@ -105,23 +105,41 @@ public:
class Wsrep_load_data_split class Wsrep_load_data_split
{ {
public: public:
Wsrep_load_data_split(THD *thd) Wsrep_load_data_split(THD *thd, TABLE *table)
: m_thd(thd) : m_thd(thd)
, m_load_data_splitting(wsrep_load_data_splitting) , m_load_data_splitting(false)
, m_fragment_unit(thd->wsrep_trx().streaming_context().fragment_unit()) , m_fragment_unit(thd->wsrep_trx().streaming_context().fragment_unit())
, m_fragment_size(thd->wsrep_trx().streaming_context().fragment_size()) , m_fragment_size(thd->wsrep_trx().streaming_context().fragment_size())
{ {
if (WSREP(m_thd) && m_load_data_splitting) /*
We support load data splitting for InnoDB only as it will use
streaming replication (SR).
*/
if (WSREP(thd) && wsrep_load_data_splitting)
{ {
/* Override streaming settings with backward compatible values for handlerton *ht= table->s->db_type();
load data splitting */ // For partitioned tables find underlying hton
m_thd->wsrep_cs().streaming_params(wsrep::streaming_context::row, 10000); if (table->file->partition_ht())
ht= table->file->partition_ht();
if (ht->db_type != DB_TYPE_INNODB)
{
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
ER_NOT_SUPPORTED_YET,
"wsrep_load_data_splitting for other than InnoDB tables");
}
else
{
/* Override streaming settings with backward compatible values for
load data splitting */
m_thd->wsrep_cs().streaming_params(wsrep::streaming_context::row, 10000);
m_load_data_splitting= true;
}
} }
} }
~Wsrep_load_data_split() ~Wsrep_load_data_split()
{ {
if (WSREP(m_thd) && m_load_data_splitting) if (m_load_data_splitting)
{ {
/* Restore original settings */ /* Restore original settings */
m_thd->wsrep_cs().streaming_params(m_fragment_unit, m_fragment_size); m_thd->wsrep_cs().streaming_params(m_fragment_unit, m_fragment_size);
@ -346,6 +364,7 @@ int mysql_load(THD *thd, const sql_exchange *ex, TABLE_LIST *table_list,
bool is_concurrent; bool is_concurrent;
#endif #endif
const char *db= table_list->db.str; // This is never null const char *db= table_list->db.str; // This is never null
/* /*
If path for file is not defined, we will use the current database. If path for file is not defined, we will use the current database.
If this is not set, we will use the directory where the table to be If this is not set, we will use the directory where the table to be
@ -356,9 +375,6 @@ int mysql_load(THD *thd, const sql_exchange *ex, TABLE_LIST *table_list,
bool transactional_table __attribute__((unused)); bool transactional_table __attribute__((unused));
DBUG_ENTER("mysql_load"); DBUG_ENTER("mysql_load");
#ifdef WITH_WSREP
Wsrep_load_data_split wsrep_load_data_split(thd);
#endif /* WITH_WSREP */
/* /*
Bug #34283 Bug #34283
mysqlbinlog leaves tmpfile after termination if binlog contains mysqlbinlog leaves tmpfile after termination if binlog contains
@ -423,6 +439,11 @@ int mysql_load(THD *thd, const sql_exchange *ex, TABLE_LIST *table_list,
{ {
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
#ifdef WITH_WSREP
Wsrep_load_data_split wsrep_load_data_split(thd, table_list->table);
#endif /* WITH_WSREP */
thd_proc_info(thd, "Executing"); thd_proc_info(thd, "Executing");
/* /*
Let us emit an error if we are loading data to table which is used Let us emit an error if we are loading data to table which is used

View File

@ -4692,10 +4692,15 @@ mysql_execute_command(THD *thd)
if ((res= insert_precheck(thd, all_tables))) if ((res= insert_precheck(thd, all_tables)))
break; break;
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (WSREP(thd) && thd->wsrep_consistency_check == CONSISTENCY_CHECK_DECLARED) bool wsrep_toi= false;
const bool wsrep= WSREP(thd);
if (wsrep && thd->wsrep_consistency_check == CONSISTENCY_CHECK_DECLARED)
{ {
thd->wsrep_consistency_check = CONSISTENCY_CHECK_RUNNING; thd->wsrep_consistency_check = CONSISTENCY_CHECK_RUNNING;
wsrep_toi= true;
WSREP_TO_ISOLATION_BEGIN(first_table->db.str, first_table->table_name.str, NULL); WSREP_TO_ISOLATION_BEGIN(first_table->db.str, first_table->table_name.str, NULL);
} }
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
@ -4730,6 +4735,27 @@ mysql_execute_command(THD *thd)
if (!(res=open_and_lock_tables(thd, all_tables, TRUE, 0))) if (!(res=open_and_lock_tables(thd, all_tables, TRUE, 0)))
{ {
MYSQL_INSERT_SELECT_START(thd->query()); MYSQL_INSERT_SELECT_START(thd->query());
#ifdef WITH_WSREP
if (wsrep && !first_table->view)
{
bool is_innodb= (first_table->table->file->ht->db_type == DB_TYPE_INNODB);
// For consistency check inserted table needs to be InnoDB
if (!is_innodb && thd->wsrep_consistency_check != NO_CONSISTENCY_CHECK)
{
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
HA_ERR_UNSUPPORTED,
"Galera cluster does support consistency check only"
" for InnoDB tables.");
thd->wsrep_consistency_check= NO_CONSISTENCY_CHECK;
}
// For !InnoDB we start TOI if it is not yet started and hope for the best
if (!is_innodb && !wsrep_toi)
WSREP_TO_ISOLATION_BEGIN(first_table->db.str, first_table->table_name.str, NULL);
}
#endif /* WITH_WSREP */
/* /*
Only the INSERT table should be merged. Other will be handled by Only the INSERT table should be merged. Other will be handled by
select. select.

View File

@ -2143,6 +2143,10 @@ JOIN::optimize_inner()
select_lex->attach_to_conds, select_lex->attach_to_conds,
&cond_value); &cond_value);
sel->attach_to_conds.empty(); sel->attach_to_conds.empty();
Json_writer_object wrapper(thd);
Json_writer_object pushd(thd, "condition_pushdown_from_having");
pushd.add("conds", conds);
pushd.add("having", having);
} }
} }
@ -12846,7 +12850,8 @@ end_sj_materialize(JOIN *join, JOIN_TAB *join_tab, bool end_of_records)
if (item->is_null()) if (item->is_null())
DBUG_RETURN(NESTED_LOOP_OK); DBUG_RETURN(NESTED_LOOP_OK);
} }
fill_record(thd, table, table->field, sjm->sjm_table_cols, TRUE, FALSE); fill_record(thd, table, table->field, sjm->sjm_table_cols, true, false,
true);
if (unlikely(thd->is_error())) if (unlikely(thd->is_error()))
DBUG_RETURN(NESTED_LOOP_ERROR); /* purecov: inspected */ DBUG_RETURN(NESTED_LOOP_ERROR); /* purecov: inspected */
if (unlikely((error= table->file->ha_write_tmp_row(table->record[0])))) if (unlikely((error= table->file->ha_write_tmp_row(table->record[0]))))

View File

@ -28,6 +28,9 @@
#include "sql_acl.h" #include "sql_acl.h"
#ifdef WITH_WSREP #ifdef WITH_WSREP
#include "wsrep_mysqld.h" #include "wsrep_mysqld.h"
bool wsrep_check_sequence(THD* thd,
const sequence_definition *seq,
const bool used_engine);
#endif #endif
struct Field_definition struct Field_definition
@ -942,7 +945,8 @@ bool Sql_cmd_alter_sequence::execute(THD *thd)
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (WSREP(thd) && wsrep_thd_is_local(thd)) if (WSREP(thd) && wsrep_thd_is_local(thd))
{ {
if (wsrep_check_sequence(thd, new_seq)) const bool used_engine= lex->create_info.used_fields & HA_CREATE_USED_ENGINE;
if (wsrep_check_sequence(thd, new_seq, used_engine))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
if (wsrep_to_isolation_begin(thd, first_table->db.str, if (wsrep_to_isolation_begin(thd, first_table->db.str,

View File

@ -2994,7 +2994,7 @@ int select_result_explain_buffer::send_data(List<Item> &items)
memory. memory.
*/ */
set_current_thd(thd); set_current_thd(thd);
fill_record(thd, dst_table, dst_table->field, items, TRUE, FALSE); fill_record(thd, dst_table, dst_table->field, items, true, false, false);
res= dst_table->file->ha_write_tmp_row(dst_table->record[0]); res= dst_table->file->ha_write_tmp_row(dst_table->record[0]);
set_current_thd(cur_thd); set_current_thd(cur_thd);
DBUG_RETURN(MY_TEST(res)); DBUG_RETURN(MY_TEST(res));

View File

@ -5531,18 +5531,21 @@ int mysql_create_table_no_lock(THD *thd, Table_specification_st *create_info,
#ifdef WITH_WSREP #ifdef WITH_WSREP
/** Additional sequence checks for Galera cluster. /** Additional sequence checks for Galera cluster.
@param thd thread handle @param thd thread handle
@param seq sequence definition @param seq sequence definition
@param used_engine create used ENGINE=
@retval false success @retval false success
@retval true failure @retval true failure
*/ */
bool wsrep_check_sequence(THD* thd, const sequence_definition *seq) bool wsrep_check_sequence(THD* thd,
const sequence_definition *seq,
const bool used_engine)
{ {
enum legacy_db_type db_type; enum legacy_db_type db_type;
DBUG_ASSERT(WSREP(thd)); DBUG_ASSERT(WSREP(thd));
if (thd->lex->create_info.used_fields & HA_CREATE_USED_ENGINE) if (used_engine)
{ {
db_type= thd->lex->create_info.db_type->db_type; db_type= thd->lex->create_info.db_type->db_type;
} }
@ -5573,6 +5576,57 @@ bool wsrep_check_sequence(THD* thd, const sequence_definition *seq)
return (false); return (false);
} }
/** Additional CREATE TABLE/SEQUENCE checks for Galera cluster.
@param thd thread handle
@param wsrep_ctas CREATE TABLE AS SELECT ?
@param used_engine CREATE TABLE ... ENGINE = ?
@param create_info Create information
@retval false Galera cluster does support used clause
@retval true Galera cluster does not support used clause
*/
static
bool wsrep_check_support(THD* thd,
const bool wsrep_ctas,
const bool used_engine,
const HA_CREATE_INFO* create_info)
{
/* CREATE TABLE ... AS SELECT */
if (wsrep_ctas &&
thd->variables.wsrep_trx_fragment_size > 0)
{
my_message(ER_NOT_ALLOWED_COMMAND,
"CREATE TABLE AS SELECT is not supported with streaming replication",
MYF(0));
return true;
}
/* CREATE TABLE .. WITH SYSTEM VERSIONING AS SELECT
is not supported in Galera cluster.
*/
if (wsrep_ctas &&
create_info->versioned())
{
my_error(ER_NOT_SUPPORTED_YET, MYF(0),
"SYSTEM VERSIONING AS SELECT in Galera cluster");
return true;
}
/*
CREATE TABLE ... ENGINE=SEQUENCE is not supported in
Galera cluster.
CREATE SEQUENCE ... ENGINE=xxx Galera cluster supports
only InnoDB-sequences.
*/
if (((used_engine && create_info->db_type &&
(create_info->db_type->db_type == DB_TYPE_SEQUENCE ||
create_info->db_type->db_type >= DB_TYPE_FIRST_DYNAMIC)) ||
thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE) &&
wsrep_check_sequence(thd, create_info->seq_create_info, used_engine))
return true;
return false;
}
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
/** /**
@ -5639,15 +5693,6 @@ bool mysql_create_table(THD *thd, TABLE_LIST *create_table,
if (!(thd->variables.option_bits & OPTION_EXPLICIT_DEF_TIMESTAMP)) if (!(thd->variables.option_bits & OPTION_EXPLICIT_DEF_TIMESTAMP))
promote_first_timestamp_column(&alter_info->create_list); promote_first_timestamp_column(&alter_info->create_list);
#ifdef WITH_WSREP
if (thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE &&
WSREP(thd) && wsrep_thd_is_local_toi(thd))
{
if (wsrep_check_sequence(thd, create_info->seq_create_info))
DBUG_RETURN(true);
}
#endif /* WITH_WSREP */
/* We can abort create table for any table type */ /* We can abort create table for any table type */
thd->abort_on_warning= thd->is_strict_mode(); thd->abort_on_warning= thd->is_strict_mode();
@ -10154,6 +10199,7 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db,
TODO: this design is obsolete and will be removed. TODO: this design is obsolete and will be removed.
*/ */
int table_kind= check_if_log_table(table_list, FALSE, NullS); int table_kind= check_if_log_table(table_list, FALSE, NullS);
const bool used_engine= create_info->used_fields & HA_CREATE_USED_ENGINE;
if (table_kind) if (table_kind)
{ {
@ -10165,7 +10211,7 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db,
} }
/* Disable alter of log tables to unsupported engine */ /* Disable alter of log tables to unsupported engine */
if ((create_info->used_fields & HA_CREATE_USED_ENGINE) && if ((used_engine) &&
(!create_info->db_type || /* unknown engine */ (!create_info->db_type || /* unknown engine */
!(create_info->db_type->flags & HTON_SUPPORT_LOG_TABLES))) !(create_info->db_type->flags & HTON_SUPPORT_LOG_TABLES)))
{ {
@ -10247,7 +10293,7 @@ bool mysql_alter_table(THD *thd, const LEX_CSTRING *new_db,
if we can support implementing storage engine. if we can support implementing storage engine.
*/ */
if (WSREP(thd) && table && table->s->sequence && if (WSREP(thd) && table && table->s->sequence &&
wsrep_check_sequence(thd, thd->lex->create_info.seq_create_info)) wsrep_check_sequence(thd, thd->lex->create_info.seq_create_info, used_engine))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
if (WSREP(thd) && if (WSREP(thd) &&
@ -10738,12 +10784,10 @@ do_continue:;
#endif #endif
#ifdef WITH_WSREP #ifdef WITH_WSREP
// ALTER TABLE for sequence object, check can we support it
if (table->s->sequence && WSREP(thd) && if (table->s->sequence && WSREP(thd) &&
wsrep_thd_is_local_toi(thd)) wsrep_check_sequence(thd, create_info->seq_create_info, used_engine))
{
if (wsrep_check_sequence(thd, create_info->seq_create_info))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
}
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
/* /*
@ -12318,17 +12362,11 @@ bool Sql_cmd_create_table_like::execute(THD *thd)
#endif #endif
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (wsrep_ctas) if (WSREP(thd) &&
wsrep_check_support(thd, wsrep_ctas, used_engine, &create_info))
{ {
if (thd->variables.wsrep_trx_fragment_size > 0) res= 1;
{ goto end_with_restore_list;
my_message(
ER_NOT_ALLOWED_COMMAND,
"CREATE TABLE AS SELECT is not supported with streaming replication",
MYF(0));
res= 1;
goto end_with_restore_list;
}
} }
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
@ -12480,6 +12518,7 @@ bool Sql_cmd_create_table_like::execute(THD *thd)
create_table->table_name, create_table->db)) create_table->table_name, create_table->db))
goto end_with_restore_list; goto end_with_restore_list;
#ifdef WITH_WSREP
/* /*
In STATEMENT format, we probably have to replicate also temporary In STATEMENT format, we probably have to replicate also temporary
tables, like mysql replication does. Also check if the requested tables, like mysql replication does. Also check if the requested
@ -12488,15 +12527,15 @@ bool Sql_cmd_create_table_like::execute(THD *thd)
if (WSREP(thd)) if (WSREP(thd))
{ {
handlerton *orig_ht= create_info.db_type; handlerton *orig_ht= create_info.db_type;
if (!check_engine(thd, create_table->db.str, if (!check_engine(thd, create_table->db.str,
create_table->table_name.str, create_table->table_name.str,
&create_info) && &create_info) &&
(!thd->is_current_stmt_binlog_format_row() || (!thd->is_current_stmt_binlog_format_row() ||
!create_info.tmp_table())) !create_info.tmp_table()))
{ {
#ifdef WITH_WSREP
if (thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE && if (thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE &&
wsrep_check_sequence(thd, lex->create_info.seq_create_info)) wsrep_check_sequence(thd, lex->create_info.seq_create_info, used_engine))
DBUG_RETURN(true); DBUG_RETURN(true);
WSREP_TO_ISOLATION_BEGIN_ALTER(create_table->db.str, WSREP_TO_ISOLATION_BEGIN_ALTER(create_table->db.str,
@ -12507,14 +12546,15 @@ bool Sql_cmd_create_table_like::execute(THD *thd)
WSREP_WARN("CREATE TABLE isolation failure"); WSREP_WARN("CREATE TABLE isolation failure");
res= true; res= true;
goto end_with_restore_list; goto end_with_restore_list;
} }
#endif /* WITH_WSREP */
} }
// check_engine will set db_type to NULL if e.g. TEMPORARY is // check_engine will set db_type to NULL if e.g. TEMPORARY is
// not supported by the storage engine, this case is checked // not supported by the storage engine, this case is checked
// again in mysql_create_table // again in mysql_create_table
create_info.db_type= orig_ht; create_info.db_type= orig_ht;
} }
#endif /* WITH_WSREP */
/* Regular CREATE TABLE */ /* Regular CREATE TABLE */
res= mysql_create_table(thd, create_table, &create_info, &alter_info); res= mysql_create_table(thd, create_table, &create_info, &alter_info);
} }

View File

@ -285,8 +285,4 @@ extern mysql_mutex_t LOCK_gdl;
bool check_engine(THD *, const char *, const char *, HA_CREATE_INFO *); bool check_engine(THD *, const char *, const char *, HA_CREATE_INFO *);
#ifdef WITH_WSREP
bool wsrep_check_sequence(THD* thd, const class sequence_definition *seq);
#endif
#endif /* SQL_TABLE_INCLUDED */ #endif /* SQL_TABLE_INCLUDED */

View File

@ -116,12 +116,12 @@ int select_unit::send_data(List<Item> &values)
if (table->no_rows_with_nulls) if (table->no_rows_with_nulls)
table->null_catch_flags= CHECK_ROW_FOR_NULLS_TO_REJECT; table->null_catch_flags= CHECK_ROW_FOR_NULLS_TO_REJECT;
fill_record(thd, table, table->field + addon_cnt, values, true, false); fill_record(thd, table, table->field + addon_cnt, values, true, false, true);
/* set up initial values for records to be written */ /* set up initial values for records to be written */
if (addon_cnt && step == UNION_TYPE) if (addon_cnt && step == UNION_TYPE)
{ {
DBUG_ASSERT(addon_cnt == 1); DBUG_ASSERT(addon_cnt == 1);
table->field[0]->store((longlong) curr_step, 1); table->field[0]->store((ulonglong) curr_step, 1);
} }
if (unlikely(thd->is_error())) if (unlikely(thd->is_error()))
@ -619,7 +619,7 @@ int select_unit_ext::send_data(List<Item> &values)
if (table->no_rows_with_nulls) if (table->no_rows_with_nulls)
table->null_catch_flags= CHECK_ROW_FOR_NULLS_TO_REJECT; table->null_catch_flags= CHECK_ROW_FOR_NULLS_TO_REJECT;
fill_record(thd, table, table->field + addon_cnt, values, true, false); fill_record(thd, table, table->field + addon_cnt, values, true, false, true);
/* set up initial values for records to be written */ /* set up initial values for records to be written */
if ( step == UNION_TYPE ) if ( step == UNION_TYPE )
{ {
@ -1003,7 +1003,7 @@ int select_union_direct::send_data(List<Item> &items)
} }
send_records++; send_records++;
fill_record(thd, table, table->field, items, true, false); fill_record(thd, table, table->field, items, true, false, true);
if (unlikely(thd->is_error())) if (unlikely(thd->is_error()))
return true; /* purecov: inspected */ return true; /* purecov: inspected */

View File

@ -2161,6 +2161,10 @@ int multi_update::prepare(List<Item> &not_used_values,
{ {
Item *value= value_it++; Item *value= value_it++;
uint offset= item->field->table->pos_in_table_list->shared; uint offset= item->field->table->pos_in_table_list->shared;
if (value->associate_with_target_field(thd, item))
DBUG_RETURN(1);
fields_for_table[offset]->push_back(item, thd->mem_root); fields_for_table[offset]->push_back(item, thd->mem_root);
values_for_table[offset]->push_back(value, thd->mem_root); values_for_table[offset]->push_back(value, thd->mem_root);
} }
@ -2658,7 +2662,7 @@ int multi_update::send_data(List<Item> &not_used_values)
tmp_table_param[offset].func_count); tmp_table_param[offset].func_count);
fill_record(thd, tmp_table, fill_record(thd, tmp_table,
tmp_table->field + 1 + unupdated_check_opt_tables.elements, tmp_table->field + 1 + unupdated_check_opt_tables.elements,
*values_for_table[offset], TRUE, FALSE); *values_for_table[offset], true, false, false);
/* Write row, ignoring duplicated updates to a row */ /* Write row, ignoring duplicated updates to a row */
error= tmp_table->file->ha_write_tmp_row(tmp_table->record[0]); error= tmp_table->file->ha_write_tmp_row(tmp_table->record[0]);

View File

@ -771,7 +771,15 @@ static bool pack_vcols(THD *thd, String *buf, List<Create_field> &create_fields,
? VCOL_GENERATED_STORED : VCOL_GENERATED_VIRTUAL)) ? VCOL_GENERATED_STORED : VCOL_GENERATED_VIRTUAL))
return 1; return 1;
if (field->has_default_expression() && !field->has_default_now_unireg_check()) if (field->has_default_expression() && !field->has_default_now_unireg_check())
if (pack_expression(buf, field->default_value, field_nr, VCOL_DEFAULT)) if (pack_expression(buf, field->default_value, field_nr, VCOL_DEFAULT) ||
/*
field->has_default_expression() can return error (e.g. because
the method Item_param::basic_const_item invokes
invalid_default_param()
in case either DEFAULT_VALUE or IGNORE_VALUE is handled).
Take this fact into account and return error in this case.
*/
thd->is_error())
return 1; return 1;
if (field->check_constraint) if (field->check_constraint)
if (pack_expression(buf, field->check_constraint, field_nr, if (pack_expression(buf, field->check_constraint, field_nr,

View File

@ -14865,16 +14865,6 @@ ha_innobase::check(
table->s->table_name.str); table->s->table_name.str);
DBUG_RETURN(HA_ADMIN_CORRUPT); DBUG_RETURN(HA_ADMIN_CORRUPT);
} else if (!m_prebuilt->table->is_readable() &&
!m_prebuilt->table->space) {
ib_senderrf(
thd, IB_LOG_LEVEL_ERROR,
ER_TABLESPACE_MISSING,
table->s->table_name.str);
DBUG_RETURN(HA_ADMIN_CORRUPT);
} }
m_prebuilt->trx->op_info = "checking table"; m_prebuilt->trx->op_info = "checking table";

View File

@ -4393,6 +4393,23 @@ row_import_for_mysql(
ibuf_delete_for_discarded_space(table->space_id); ibuf_delete_for_discarded_space(table->space_id);
#ifdef BTR_CUR_HASH_ADAPT
/* On DISCARD TABLESPACE, we did not drop any adaptive hash
index entries. If we replaced the discarded tablespace with a
smaller one here, there could still be some adaptive hash
index entries that point to cached garbage pages in the buffer
pool, because PageConverter::operator() only evicted those
pages that were replaced by the imported pages. We must
detach any remaining adaptive hash index entries, because the
adaptive hash index must be a subset of the table contents;
false positives are not tolerated. */
for (dict_index_t* index = UT_LIST_GET_FIRST(table->indexes); index;
index = UT_LIST_GET_NEXT(indexes, index)) {
index = index->clone_if_needed();
}
#endif /* BTR_CUR_HASH_ADAPT */
UT_LIST_GET_FIRST(table->indexes)->clear_instant_alter();
trx_start_if_not_started(prebuilt->trx, true); trx_start_if_not_started(prebuilt->trx, true);
trx = trx_create(); trx = trx_create();
@ -4547,21 +4564,6 @@ row_import_for_mysql(
DBUG_EXECUTE_IF("ib_import_reset_space_and_lsn_failure", DBUG_EXECUTE_IF("ib_import_reset_space_and_lsn_failure",
err = DB_TOO_MANY_CONCURRENT_TRXS;); err = DB_TOO_MANY_CONCURRENT_TRXS;);
#ifdef BTR_CUR_HASH_ADAPT
/* On DISCARD TABLESPACE, we did not drop any adaptive hash
index entries. If we replaced the discarded tablespace with a
smaller one here, there could still be some adaptive hash
index entries that point to cached garbage pages in the buffer
pool, because PageConverter::operator() only evicted those
pages that were replaced by the imported pages. We must
detach any remaining adaptive hash index entries, because the
adaptive hash index must be a subset of the table contents;
false positives are not tolerated. */
for (dict_index_t* index = UT_LIST_GET_FIRST(table->indexes); index;
index = UT_LIST_GET_NEXT(indexes, index)) {
index = index->clone_if_needed();
}
#endif /* BTR_CUR_HASH_ADAPT */
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
char table_name[MAX_FULL_NAME_LEN + 1]; char table_name[MAX_FULL_NAME_LEN + 1];

View File

@ -3040,7 +3040,6 @@ row_discard_tablespace(
dict_table_change_id_in_cache(table, new_id); dict_table_change_id_in_cache(table, new_id);
dict_index_t* index = UT_LIST_GET_FIRST(table->indexes); dict_index_t* index = UT_LIST_GET_FIRST(table->indexes);
if (index) index->clear_instant_alter();
/* Reset the root page numbers. */ /* Reset the root page numbers. */
for (; index; index = UT_LIST_GET_NEXT(indexes, index)) { for (; index; index = UT_LIST_GET_NEXT(indexes, index)) {

View File

@ -4395,13 +4395,11 @@ early_not_found:
DBUG_RETURN(DB_RECORD_NOT_FOUND); DBUG_RETURN(DB_RECORD_NOT_FOUND);
} }
#if SIZEOF_SIZE_T < 8
if (UNIV_LIKELY(~prebuilt->n_rows_fetched))
#endif
prebuilt->n_rows_fetched++; prebuilt->n_rows_fetched++;
if (prebuilt->n_rows_fetched > 1000000000) {
/* Prevent wrap-over */
prebuilt->n_rows_fetched = 500000000;
}
mode = pcur->search_mode; mode = pcur->search_mode;
} }

View File

@ -46,7 +46,6 @@ CREATE TABLE t1 (i INT, j INT, k INT, PRIMARY KEY (i)) ENGINE = ROCKSDB PARTITIO
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 optimize status OK test.t1 optimize status OK
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK test.t1 analyze status OK
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 repair status OK test.t1 repair status OK

View File

@ -13,7 +13,6 @@ t 1 x 1 x A 5 NULL NULL YES BTREE
t 1 y 1 y A 5 NULL NULL YES BTREE t 1 y 1 y A 5 NULL NULL YES BTREE
alter table t analyze partition p0; alter table t analyze partition p0;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t analyze status Engine-independent statistics collected
test.t analyze status OK test.t analyze status OK
show indexes from t; show indexes from t;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
@ -22,7 +21,6 @@ t 1 x 1 x A 5 NULL NULL YES BTREE
t 1 y 1 y A 5 NULL NULL YES BTREE t 1 y 1 y A 5 NULL NULL YES BTREE
alter table t analyze partition p1; alter table t analyze partition p1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t analyze status Engine-independent statistics collected
test.t analyze status OK test.t analyze status OK
show indexes from t; show indexes from t;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
@ -37,7 +35,6 @@ t 1 x 1 x A 9 NULL NULL YES BTREE
t 1 y 1 y A 9 NULL NULL YES BTREE t 1 y 1 y A 9 NULL NULL YES BTREE
alter table t analyze partition p0; alter table t analyze partition p0;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t analyze status Engine-independent statistics collected
test.t analyze status OK test.t analyze status OK
show indexes from t; show indexes from t;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
@ -46,7 +43,6 @@ t 1 x 1 x A 9 NULL NULL YES BTREE
t 1 y 1 y A 9 NULL NULL YES BTREE t 1 y 1 y A 9 NULL NULL YES BTREE
alter table t analyze partition p1; alter table t analyze partition p1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t analyze status Engine-independent statistics collected
test.t analyze status OK test.t analyze status OK
show indexes from t; show indexes from t;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment

View File

@ -1020,7 +1020,6 @@ a b
2001 Second in MAX 2001 Second in MAX
ALTER TABLE t1 ANALYZE PARTITION MAX; ALTER TABLE t1 ANALYZE PARTITION MAX;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
MySQL_Test_DB.t1 analyze status Engine-independent statistics collected
MySQL_Test_DB.t1 analyze status OK MySQL_Test_DB.t1 analyze status OK
# Truncate without FLUSH # Truncate without FLUSH
ALTER TABLE t1 TRUNCATE PARTITION MAX; ALTER TABLE t1 TRUNCATE PARTITION MAX;

View File

@ -949,7 +949,6 @@ a b
2001 Second in MAX 2001 Second in MAX
ALTER TABLE t1 ANALYZE PARTITION MAX; ALTER TABLE t1 ANALYZE PARTITION MAX;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
MySQL_Test_DB.t1 analyze status Engine-independent statistics collected
MySQL_Test_DB.t1 analyze status OK MySQL_Test_DB.t1 analyze status OK
# Truncate without FLUSH # Truncate without FLUSH
ALTER TABLE t1 TRUNCATE PARTITION MAX; ALTER TABLE t1 TRUNCATE PARTITION MAX;

View File

@ -987,7 +987,6 @@ a b
2001 Second in MAX 2001 Second in MAX
ALTER TABLE t1 ANALYZE PARTITION MAX; ALTER TABLE t1 ANALYZE PARTITION MAX;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
mysql_test_db.t1 analyze status Engine-independent statistics collected
mysql_test_db.t1 analyze status OK mysql_test_db.t1 analyze status OK
# Truncate without FLUSH # Truncate without FLUSH
ALTER TABLE t1 TRUNCATE PARTITION MAX; ALTER TABLE t1 TRUNCATE PARTITION MAX;