mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
Merge branch '10.0-galera' into 10.1
This commit is contained in:
commit
a5b0a32ac3
16 changed files with 566 additions and 54 deletions
|
@ -11,6 +11,10 @@
|
|||
# Don't write these queries to binlog
|
||||
set SQL_LOG_BIN=0;
|
||||
|
||||
# Do not replicate updates to other galera nodes
|
||||
--error 0,1193
|
||||
set WSREP_ON=0;
|
||||
|
||||
# Turn off any debug crashes, allow the variable to be
|
||||
# non existent in release builds
|
||||
--error 0,1193
|
||||
|
|
|
@ -20,4 +20,121 @@ pk i
|
|||
SELECT * FROM t1;
|
||||
pk i
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV#7501 : alter table exchange partition is not replicated in
|
||||
# galera cluster
|
||||
#
|
||||
|
||||
# On node_1
|
||||
CREATE TABLE test.t1 (
|
||||
i INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (i)
|
||||
) ENGINE=INNODB
|
||||
PARTITION BY RANGE (i)
|
||||
(PARTITION p1 VALUES LESS THAN (10) ENGINE = INNODB,
|
||||
PARTITION p2 VALUES LESS THAN (20) ENGINE = INNODB,
|
||||
PARTITION pMax VALUES LESS THAN MAXVALUE ENGINE = INNODB);
|
||||
INSERT INTO test.t1 (i) VALUE (9),(19);
|
||||
CREATE TABLE test.p1 LIKE test.t1;
|
||||
ALTER TABLE test.p1 REMOVE PARTITIONING;
|
||||
ALTER TABLE test.t1 EXCHANGE PARTITION p1 WITH TABLE test.p1;
|
||||
SELECT * FROM test.t1;
|
||||
i
|
||||
19
|
||||
SELECT * FROM test.p1;
|
||||
i
|
||||
9
|
||||
|
||||
# On node_2
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`i` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`i`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY RANGE (i)
|
||||
(PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB,
|
||||
PARTITION p2 VALUES LESS THAN (20) ENGINE = InnoDB,
|
||||
PARTITION pMax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
|
||||
SHOW CREATE TABLE p1;
|
||||
Table Create Table
|
||||
p1 CREATE TABLE `p1` (
|
||||
`i` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`i`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1
|
||||
SELECT * FROM test.t1;
|
||||
i
|
||||
19
|
||||
SELECT * FROM test.p1;
|
||||
i
|
||||
9
|
||||
|
||||
# On node_1
|
||||
ALTER TABLE t1 TRUNCATE PARTITION p2;
|
||||
SELECT * FROM test.t1;
|
||||
i
|
||||
|
||||
# On node_2
|
||||
SELECT * FROM test.t1;
|
||||
i
|
||||
|
||||
# On node_1
|
||||
ALTER TABLE t1 DROP PARTITION p2;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`i` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`i`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY RANGE (i)
|
||||
(PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB,
|
||||
PARTITION pMax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
|
||||
|
||||
# On node_2
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`i` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (`i`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
/*!50100 PARTITION BY RANGE (i)
|
||||
(PARTITION p1 VALUES LESS THAN (10) ENGINE = InnoDB,
|
||||
PARTITION pMax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */
|
||||
DROP TABLE t1, p1;
|
||||
#
|
||||
# MDEV-5146: Bulk loads into partitioned table not working
|
||||
#
|
||||
# Case 1: wsrep_load_data_splitting = ON & LOAD DATA with 20002
|
||||
# entries.
|
||||
SET GLOBAL wsrep_load_data_splitting = ON;
|
||||
CREATE TABLE t1 (pk INT PRIMARY KEY)
|
||||
ENGINE=INNODB PARTITION BY HASH(pk) PARTITIONS 2;
|
||||
SELECT COUNT(*) = 20002 FROM t1;
|
||||
COUNT(*) = 20002
|
||||
1
|
||||
wsrep_last_committed_diff
|
||||
1
|
||||
DROP TABLE t1;
|
||||
# Case 2: wsrep_load_data_splitting = ON & LOAD DATA with 101 entries.
|
||||
SET GLOBAL wsrep_load_data_splitting = ON;
|
||||
CREATE TABLE t1 (pk INT PRIMARY KEY)
|
||||
ENGINE=INNODB PARTITION BY HASH(pk) PARTITIONS 2;
|
||||
SELECT COUNT(*) = 101 FROM t1;
|
||||
COUNT(*) = 101
|
||||
1
|
||||
wsrep_last_committed_diff
|
||||
1
|
||||
DROP TABLE t1;
|
||||
# Case 3: wsrep_load_data_splitting = OFF & LOAD DATA with 20002
|
||||
# entries.
|
||||
SET GLOBAL wsrep_load_data_splitting = OFF;
|
||||
CREATE TABLE t1 (pk INT PRIMARY KEY)
|
||||
ENGINE=INNODB PARTITION BY HASH(pk) PARTITIONS 2;
|
||||
SELECT COUNT(*) = 20002 FROM t1;
|
||||
COUNT(*) = 20002
|
||||
1
|
||||
wsrep_last_committed_diff
|
||||
1
|
||||
DROP TABLE t1;
|
||||
SET GLOBAL wsrep_load_data_splitting = 1;;
|
||||
# End of test
|
||||
|
|
38
mysql-test/suite/galera/r/rename.result
Normal file
38
mysql-test/suite/galera/r/rename.result
Normal file
|
@ -0,0 +1,38 @@
|
|||
#
|
||||
# MDEV-8598 : Failed MySQL DDL commands and Galera replication
|
||||
#
|
||||
# On node 1
|
||||
USE test;
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUE(1);
|
||||
SELECT * FROM t1;
|
||||
i
|
||||
1
|
||||
# Create a new user 'foo' with limited privileges
|
||||
GRANT SELECT on test.* TO foo@localhost;
|
||||
# Open connection to the 1st node using 'test_user1' user.
|
||||
SELECT * FROM t1;
|
||||
i
|
||||
1
|
||||
# Following RENAME should not replicate to other node.
|
||||
RENAME TABLE t1 TO t2;
|
||||
ERROR 42000: DROP, ALTER command denied to user 'foo'@'localhost' for table 't1'
|
||||
# On node 2
|
||||
USE test;
|
||||
SELECT * FROM t1;
|
||||
i
|
||||
1
|
||||
# On node_1
|
||||
RENAME TABLE t1 TO t2;
|
||||
SHOW TABLES;
|
||||
Tables_in_test
|
||||
t2
|
||||
# On node 2
|
||||
USE test;
|
||||
SELECT * FROM t2;
|
||||
i
|
||||
1
|
||||
DROP USER foo@localhost;
|
||||
DROP TABLE t2;
|
||||
# End of tests
|
|
@ -4,4 +4,49 @@
|
|||
USE test;
|
||||
CREATE DEFINER=CURRENT_USER VIEW v1 AS SELECT 1;
|
||||
DROP VIEW v1;
|
||||
#
|
||||
# MDEV-8464 : ALTER VIEW not replicated in some cases
|
||||
#
|
||||
# On node_1
|
||||
USE test;
|
||||
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||
CREATE DEFINER=CURRENT_USER VIEW v1 AS SELECT * FROM t1;
|
||||
CREATE ALGORITHM=MERGE VIEW v2 AS SELECT * FROM t1;
|
||||
CREATE ALGORITHM=TEMPTABLE VIEW v3 AS SELECT * FROM t1;
|
||||
CREATE ALGORITHM=UNDEFINED DEFINER=CURRENT_USER VIEW v4 AS SELECT * FROM t1;
|
||||
# On node_2
|
||||
USE test;
|
||||
SHOW CREATE VIEW v1;
|
||||
View Create View character_set_client collation_connection
|
||||
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`i` AS `i` from `t1` latin1 latin1_swedish_ci
|
||||
SHOW CREATE VIEW v2;
|
||||
View Create View character_set_client collation_connection
|
||||
v2 CREATE ALGORITHM=MERGE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select `t1`.`i` AS `i` from `t1` latin1 latin1_swedish_ci
|
||||
SHOW CREATE VIEW v3;
|
||||
View Create View character_set_client collation_connection
|
||||
v3 CREATE ALGORITHM=TEMPTABLE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3` AS select `t1`.`i` AS `i` from `t1` latin1 latin1_swedish_ci
|
||||
SHOW CREATE VIEW v4;
|
||||
View Create View character_set_client collation_connection
|
||||
v4 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v4` AS select `t1`.`i` AS `i` from `t1` latin1 latin1_swedish_ci
|
||||
# On node_1
|
||||
ALTER ALGORITHM=MERGE VIEW v1 AS SELECT * FROM t1;
|
||||
ALTER ALGORITHM=UNDEFINED VIEW v2 AS SELECT * FROM t1;
|
||||
ALTER DEFINER=CURRENT_USER VIEW v3 AS SELECT * FROM t1;
|
||||
ALTER ALGORITHM=TEMPTABLE DEFINER=CURRENT_USER VIEW v4 AS SELECT * FROM t1;
|
||||
# On node_2
|
||||
SHOW CREATE VIEW v1;
|
||||
View Create View character_set_client collation_connection
|
||||
v1 CREATE ALGORITHM=MERGE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`i` AS `i` from `t1` latin1 latin1_swedish_ci
|
||||
SHOW CREATE VIEW v2;
|
||||
View Create View character_set_client collation_connection
|
||||
v2 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select `t1`.`i` AS `i` from `t1` latin1 latin1_swedish_ci
|
||||
SHOW CREATE VIEW v3;
|
||||
View Create View character_set_client collation_connection
|
||||
v3 CREATE ALGORITHM=TEMPTABLE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3` AS select `t1`.`i` AS `i` from `t1` latin1 latin1_swedish_ci
|
||||
SHOW CREATE VIEW v4;
|
||||
View Create View character_set_client collation_connection
|
||||
v4 CREATE ALGORITHM=TEMPTABLE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v4` AS select `t1`.`i` AS `i` from `t1` latin1 latin1_swedish_ci
|
||||
# Cleanup
|
||||
DROP VIEW v1, v2, v3, v4;
|
||||
DROP TABLE t1;
|
||||
# End of tests
|
||||
|
|
|
@ -33,7 +33,7 @@ push @::global_suppressions,
|
|||
qr(WSREP: last inactive check more than .* skipping check),
|
||||
qr(WSREP: SQL statement was ineffective),
|
||||
qr(WSREP: Releasing seqno [0-9]* before [0-9]* was assigned.),
|
||||
qr|WSREP: access file\(gvwstate.dat\) failed\(No such file or directory\)|,
|
||||
qr|WSREP: access file\(.*gvwstate.dat\) failed\(No such file or directory\)|,
|
||||
qr(WSREP: Quorum: No node with complete state),
|
||||
qr(WSREP: Initial position was provided by configuration or SST, avoiding override),
|
||||
qr|WSREP: discarding established \(time wait\) .*|,
|
||||
|
|
|
@ -30,7 +30,7 @@ CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
|
|||
exit(0);
|
||||
EOF
|
||||
|
||||
--error ER_UNKNOWN_COM_ERROR,ER_LOCK_WAIT_TIMEOUT
|
||||
--error ER_UNKNOWN_COM_ERROR,ER_LOCK_WAIT_TIMEOUT,ER_LOCK_DEADLOCK
|
||||
INSERT INTO t1 VALUES (1);
|
||||
|
||||
--echo Resuming node_2 ...
|
||||
|
|
|
@ -27,5 +27,181 @@ SELECT * FROM t1;
|
|||
# Cleanup
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV#7501 : alter table exchange partition is not replicated in
|
||||
--echo # galera cluster
|
||||
--echo #
|
||||
|
||||
--echo
|
||||
--echo # On node_1
|
||||
--connection node_1
|
||||
|
||||
CREATE TABLE test.t1 (
|
||||
i INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
PRIMARY KEY (i)
|
||||
) ENGINE=INNODB
|
||||
PARTITION BY RANGE (i)
|
||||
(PARTITION p1 VALUES LESS THAN (10) ENGINE = INNODB,
|
||||
PARTITION p2 VALUES LESS THAN (20) ENGINE = INNODB,
|
||||
PARTITION pMax VALUES LESS THAN MAXVALUE ENGINE = INNODB);
|
||||
|
||||
INSERT INTO test.t1 (i) VALUE (9),(19);
|
||||
CREATE TABLE test.p1 LIKE test.t1;
|
||||
ALTER TABLE test.p1 REMOVE PARTITIONING;
|
||||
|
||||
ALTER TABLE test.t1 EXCHANGE PARTITION p1 WITH TABLE test.p1;
|
||||
SELECT * FROM test.t1;
|
||||
SELECT * FROM test.p1;
|
||||
|
||||
--echo
|
||||
--echo # On node_2
|
||||
--connection node_2
|
||||
|
||||
SHOW CREATE TABLE t1;
|
||||
SHOW CREATE TABLE p1;
|
||||
|
||||
SELECT * FROM test.t1;
|
||||
SELECT * FROM test.p1;
|
||||
|
||||
--echo
|
||||
--echo # On node_1
|
||||
--connection node_1
|
||||
ALTER TABLE t1 TRUNCATE PARTITION p2;
|
||||
SELECT * FROM test.t1;
|
||||
|
||||
--echo
|
||||
--echo # On node_2
|
||||
--connection node_2
|
||||
SELECT * FROM test.t1;
|
||||
|
||||
--echo
|
||||
--echo # On node_1
|
||||
--connection node_1
|
||||
ALTER TABLE t1 DROP PARTITION p2;
|
||||
SHOW CREATE TABLE t1;
|
||||
|
||||
--echo
|
||||
--echo # On node_2
|
||||
--connection node_2
|
||||
SHOW CREATE TABLE t1;
|
||||
|
||||
|
||||
# Cleanup
|
||||
DROP TABLE t1, p1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-5146: Bulk loads into partitioned table not working
|
||||
--echo #
|
||||
|
||||
# Create 2 files with 20002 & 101 entries in each.
|
||||
--perl
|
||||
open(FILE, ">", "$ENV{'MYSQLTEST_VARDIR'}/tmp/mdev-5146-1.dat") or die;
|
||||
foreach my $i (1..20002) {
|
||||
print FILE "$i\n";
|
||||
}
|
||||
|
||||
open(FILE, ">", "$ENV{'MYSQLTEST_VARDIR'}/tmp/mdev-5146-2.dat") or die;
|
||||
foreach my $i (1..101) {
|
||||
print FILE "$i\n";
|
||||
}
|
||||
EOF
|
||||
|
||||
--connection node_1
|
||||
|
||||
--let $wsrep_load_data_splitting_orig = `SELECT @@wsrep_load_data_splitting`
|
||||
|
||||
--echo # Case 1: wsrep_load_data_splitting = ON & LOAD DATA with 20002
|
||||
--echo # entries.
|
||||
|
||||
SET GLOBAL wsrep_load_data_splitting = ON;
|
||||
|
||||
CREATE TABLE t1 (pk INT PRIMARY KEY)
|
||||
ENGINE=INNODB PARTITION BY HASH(pk) PARTITIONS 2;
|
||||
|
||||
# Record wsrep_last_committed as it was before LOAD DATA
|
||||
--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'`
|
||||
|
||||
--disable_query_log
|
||||
--eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/mdev-5146-1.dat' INTO TABLE t1;
|
||||
--enable_query_log
|
||||
|
||||
--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'`
|
||||
|
||||
--connection node_2
|
||||
SELECT COUNT(*) = 20002 FROM t1;
|
||||
|
||||
# LOAD-ing 20002 rows causes 3 commits to be registered
|
||||
--disable_query_log
|
||||
--eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before + 3 AS wsrep_last_committed_diff;
|
||||
--enable_query_log
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # Case 2: wsrep_load_data_splitting = ON & LOAD DATA with 101 entries.
|
||||
|
||||
--connection node_1
|
||||
|
||||
SET GLOBAL wsrep_load_data_splitting = ON;
|
||||
|
||||
CREATE TABLE t1 (pk INT PRIMARY KEY)
|
||||
ENGINE=INNODB PARTITION BY HASH(pk) PARTITIONS 2;
|
||||
|
||||
# Record wsrep_last_committed as it was before LOAD DATA
|
||||
--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'`
|
||||
|
||||
--disable_query_log
|
||||
--eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/mdev-5146-2.dat' INTO TABLE t1;
|
||||
--enable_query_log
|
||||
|
||||
--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'`
|
||||
|
||||
--connection node_2
|
||||
SELECT COUNT(*) = 101 FROM t1;
|
||||
|
||||
# LOAD-ing 101 rows causes 1 commit to be registered
|
||||
--disable_query_log
|
||||
--eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before + 1 AS wsrep_last_committed_diff;
|
||||
--enable_query_log
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # Case 3: wsrep_load_data_splitting = OFF & LOAD DATA with 20002
|
||||
--echo # entries.
|
||||
|
||||
--connection node_1
|
||||
|
||||
SET GLOBAL wsrep_load_data_splitting = OFF;
|
||||
|
||||
CREATE TABLE t1 (pk INT PRIMARY KEY)
|
||||
ENGINE=INNODB PARTITION BY HASH(pk) PARTITIONS 2;
|
||||
|
||||
# Record wsrep_last_committed as it was before LOAD DATA
|
||||
--let $wsrep_last_committed_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'`
|
||||
|
||||
--disable_query_log
|
||||
--eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/mdev-5146-1.dat' INTO TABLE t1;
|
||||
--enable_query_log
|
||||
|
||||
--let $wsrep_last_committed_after = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_last_committed'`
|
||||
|
||||
--connection node_2
|
||||
SELECT COUNT(*) = 20002 FROM t1;
|
||||
|
||||
# LOAD-ing 20002 rows causes 1 commit to be registered
|
||||
--disable_query_log
|
||||
--eval SELECT $wsrep_last_committed_after = $wsrep_last_committed_before + 1 AS wsrep_last_committed_diff;
|
||||
--enable_query_log
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--connection node_1
|
||||
# Restore the original value
|
||||
--eval SET GLOBAL wsrep_load_data_splitting = $wsrep_load_data_splitting_orig;
|
||||
|
||||
# Cleanup
|
||||
remove_file '$MYSQLTEST_VARDIR/tmp/mdev-5146-1.dat';
|
||||
remove_file '$MYSQLTEST_VARDIR/tmp/mdev-5146-2.dat';
|
||||
|
||||
--source include/galera_end.inc
|
||||
--echo # End of test
|
||||
|
|
52
mysql-test/suite/galera/t/rename.test
Normal file
52
mysql-test/suite/galera/t/rename.test
Normal file
|
@ -0,0 +1,52 @@
|
|||
--source include/galera_cluster.inc
|
||||
--source include/have_innodb.inc
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-8598 : Failed MySQL DDL commands and Galera replication
|
||||
--echo #
|
||||
--echo # On node 1
|
||||
--connection node_1
|
||||
USE test;
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||
INSERT INTO t1 VALUE(1);
|
||||
SELECT * FROM t1;
|
||||
|
||||
--echo # Create a new user 'foo' with limited privileges
|
||||
GRANT SELECT on test.* TO foo@localhost;
|
||||
|
||||
--echo # Open connection to the 1st node using 'test_user1' user.
|
||||
--let $port_1= \$NODE_MYPORT_1
|
||||
--connect(foo_node_1,localhost,foo,,test,$port_1,)
|
||||
|
||||
--connection foo_node_1
|
||||
SELECT * FROM t1;
|
||||
--echo # Following RENAME should not replicate to other node.
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
RENAME TABLE t1 TO t2;
|
||||
|
||||
--echo # On node 2
|
||||
--connection node_2
|
||||
USE test;
|
||||
SELECT * FROM t1;
|
||||
|
||||
--echo # On node_1
|
||||
--connection node_1
|
||||
RENAME TABLE t1 TO t2;
|
||||
SHOW TABLES;
|
||||
|
||||
--echo # On node 2
|
||||
--connection node_2
|
||||
USE test;
|
||||
SELECT * FROM t2;
|
||||
|
||||
# Cleanup
|
||||
--connection node_1
|
||||
DROP USER foo@localhost;
|
||||
DROP TABLE t2;
|
||||
|
||||
--echo # End of tests
|
||||
|
|
@ -8,4 +8,43 @@ USE test;
|
|||
CREATE DEFINER=CURRENT_USER VIEW v1 AS SELECT 1;
|
||||
DROP VIEW v1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-8464 : ALTER VIEW not replicated in some cases
|
||||
--echo #
|
||||
--echo # On node_1
|
||||
--connection node_1
|
||||
USE test;
|
||||
CREATE TABLE t1(i INT) ENGINE=INNODB;
|
||||
CREATE DEFINER=CURRENT_USER VIEW v1 AS SELECT * FROM t1;
|
||||
CREATE ALGORITHM=MERGE VIEW v2 AS SELECT * FROM t1;
|
||||
CREATE ALGORITHM=TEMPTABLE VIEW v3 AS SELECT * FROM t1;
|
||||
CREATE ALGORITHM=UNDEFINED DEFINER=CURRENT_USER VIEW v4 AS SELECT * FROM t1;
|
||||
|
||||
--echo # On node_2
|
||||
--connection node_2
|
||||
USE test;
|
||||
SHOW CREATE VIEW v1;
|
||||
SHOW CREATE VIEW v2;
|
||||
SHOW CREATE VIEW v3;
|
||||
SHOW CREATE VIEW v4;
|
||||
|
||||
--echo # On node_1
|
||||
--connection node_1
|
||||
ALTER ALGORITHM=MERGE VIEW v1 AS SELECT * FROM t1;
|
||||
ALTER ALGORITHM=UNDEFINED VIEW v2 AS SELECT * FROM t1;
|
||||
ALTER DEFINER=CURRENT_USER VIEW v3 AS SELECT * FROM t1;
|
||||
ALTER ALGORITHM=TEMPTABLE DEFINER=CURRENT_USER VIEW v4 AS SELECT * FROM t1;
|
||||
|
||||
--echo # On node_2
|
||||
--connection node_2
|
||||
SHOW CREATE VIEW v1;
|
||||
SHOW CREATE VIEW v2;
|
||||
SHOW CREATE VIEW v3;
|
||||
SHOW CREATE VIEW v4;
|
||||
|
||||
--echo # Cleanup
|
||||
DROP VIEW v1, v2, v3, v4;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # End of tests
|
||||
|
||||
|
|
|
@ -25,9 +25,9 @@ return "No my_print_defaults" unless $epath;
|
|||
push @::global_suppressions,
|
||||
(
|
||||
qr(WSREP: Could not open saved state file for reading: ),
|
||||
qr(WSREP: option --wsrep-casual-reads is deprecated),
|
||||
qr(WSREP: --wsrep-casual-reads=ON takes precedence over --wsrep-sync-wait=0),
|
||||
qr|WSREP: access file\(gvwstate.dat\) failed\(No such file or directory\)|,
|
||||
qr(WSREP: option --wsrep-causal-reads is deprecated),
|
||||
qr(WSREP: --wsrep-causal-reads=ON takes precedence over --wsrep-sync-wait=0),
|
||||
qr|WSREP: access file\(.*gvwstate.dat\) failed\(No such file or directory\)|,
|
||||
);
|
||||
|
||||
$ENV{PATH}="$epath:$ENV{PATH}";
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
#include "sql_connect.h" // decrease_user_connections,
|
||||
// check_mqh,
|
||||
// reset_mqh
|
||||
#include "sql_rename.h" // mysql_rename_table
|
||||
#include "sql_rename.h" // mysql_rename_tables
|
||||
#include "sql_tablespace.h" // mysql_alter_tablespace
|
||||
#include "hostname.h" // hostname_cache_refresh
|
||||
#include "sql_acl.h" // *_ACL, check_grant, is_acl_user,
|
||||
|
@ -133,7 +133,7 @@ static void sql_kill(THD *thd, longlong id, killed_state state, killed_type type
|
|||
static void sql_kill_user(THD *thd, LEX_USER *user, killed_state state);
|
||||
static bool lock_tables_precheck(THD *thd, TABLE_LIST *tables);
|
||||
static bool execute_show_status(THD *, TABLE_LIST *);
|
||||
static bool execute_rename_table(THD *, TABLE_LIST *, TABLE_LIST *);
|
||||
static bool check_rename_table(THD *, TABLE_LIST *, TABLE_LIST *);
|
||||
|
||||
const char *any_db="*any*"; // Special symbol for check_access
|
||||
|
||||
|
@ -3589,8 +3589,12 @@ end_with_restore_list:
|
|||
#endif /* HAVE_REPLICATION */
|
||||
case SQLCOM_RENAME_TABLE:
|
||||
{
|
||||
if (check_rename_table(thd, first_table, all_tables))
|
||||
goto error;
|
||||
|
||||
WSREP_TO_ISOLATION_BEGIN(0, 0, first_table)
|
||||
if (execute_rename_table(thd, first_table, all_tables))
|
||||
|
||||
if (mysql_rename_tables(thd, first_table, 0))
|
||||
goto error;
|
||||
break;
|
||||
}
|
||||
|
@ -5880,8 +5884,8 @@ static bool execute_show_status(THD *thd, TABLE_LIST *all_tables)
|
|||
}
|
||||
|
||||
|
||||
static bool execute_rename_table(THD *thd, TABLE_LIST *first_table,
|
||||
TABLE_LIST *all_tables)
|
||||
static bool check_rename_table(THD *thd, TABLE_LIST *first_table,
|
||||
TABLE_LIST *all_tables)
|
||||
{
|
||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||
TABLE_LIST *table;
|
||||
|
@ -5911,7 +5915,7 @@ static bool execute_rename_table(THD *thd, TABLE_LIST *first_table,
|
|||
return 1;
|
||||
}
|
||||
|
||||
return mysql_rename_tables(thd, first_table, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -531,6 +531,24 @@ bool Sql_cmd_alter_table_exchange_partition::
|
|||
&alter_prelocking_strategy))
|
||||
DBUG_RETURN(true);
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
if (WSREP_ON)
|
||||
{
|
||||
/* Forward declaration */
|
||||
TABLE *find_temporary_table(THD *thd, const TABLE_LIST *tl);
|
||||
|
||||
if ((!thd->is_current_stmt_binlog_format_row() ||
|
||||
/* TODO: Do we really need to check for temp tables in this case? */
|
||||
!find_temporary_table(thd, table_list)) &&
|
||||
wsrep_to_isolation_begin(thd, table_list->db, table_list->table_name,
|
||||
NULL))
|
||||
{
|
||||
WSREP_WARN("ALTER TABLE EXCHANGE PARTITION isolation failure");
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
}
|
||||
#endif /* WITH_WSREP */
|
||||
|
||||
part_table= table_list->table;
|
||||
swap_table= swap_table_list->table;
|
||||
|
||||
|
@ -767,6 +785,7 @@ bool Sql_cmd_alter_table_truncate_partition::execute(THD *thd)
|
|||
#ifdef WITH_WSREP
|
||||
if (WSREP_ON)
|
||||
{
|
||||
/* Forward declaration */
|
||||
TABLE *find_temporary_table(THD *thd, const TABLE_LIST *tl);
|
||||
|
||||
if ((!thd->is_current_stmt_binlog_format_row() ||
|
||||
|
@ -775,7 +794,7 @@ bool Sql_cmd_alter_table_truncate_partition::execute(THD *thd)
|
|||
thd, first_table->db, first_table->table_name, NULL)
|
||||
)
|
||||
{
|
||||
WSREP_WARN("ALTER TABLE isolation failure");
|
||||
WSREP_WARN("ALTER TABLE TRUNCATE PARTITION isolation failure");
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2196,8 +2196,11 @@ static void store_key_options(THD *thd, String *packet, TABLE *table,
|
|||
void
|
||||
view_store_options(THD *thd, TABLE_LIST *table, String *buff)
|
||||
{
|
||||
buff->append(STRING_WITH_LEN("ALGORITHM="));
|
||||
buff->append(view_algorithm(table));
|
||||
if (table->algorithm != VIEW_ALGORITHM_INHERIT)
|
||||
{
|
||||
buff->append(STRING_WITH_LEN("ALGORITHM="));
|
||||
buff->append(view_algorithm(table));
|
||||
}
|
||||
buff->append(' ');
|
||||
append_definer(thd, buff, &table->definer.user, &table->definer.host);
|
||||
if (table->view_suid)
|
||||
|
|
|
@ -1298,7 +1298,13 @@ create_view_query(THD *thd, uchar** buf, size_t* buf_len)
|
|||
buff.append(command[thd->lex->create_view_mode].str,
|
||||
command[thd->lex->create_view_mode].length);
|
||||
|
||||
if (!lex->definer)
|
||||
LEX_USER *definer;
|
||||
|
||||
if (lex->definer)
|
||||
{
|
||||
definer= get_current_user(thd, lex->definer);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
DEFINER-clause is missing; we have to create default definer in
|
||||
|
@ -1306,16 +1312,19 @@ create_view_query(THD *thd, uchar** buf, size_t* buf_len)
|
|||
If this is an ALTER VIEW then the current user should be set as
|
||||
the definer.
|
||||
*/
|
||||
definer= create_default_definer(thd, false);
|
||||
}
|
||||
|
||||
if (!(lex->definer= create_default_definer(thd, false)))
|
||||
{
|
||||
WSREP_WARN("view default definer issue");
|
||||
}
|
||||
if (definer)
|
||||
{
|
||||
views->definer.user = definer->user;
|
||||
views->definer.host = definer->host;
|
||||
} else {
|
||||
WSREP_ERROR("Failed to get DEFINER for VIEW.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
views->algorithm = lex->create_view_algorithm;
|
||||
views->definer.user = lex->definer->user;
|
||||
views->definer.host = lex->definer->host;
|
||||
views->view_suid = lex->create_view_suid;
|
||||
views->with_check = lex->create_view_check;
|
||||
|
||||
|
@ -1367,6 +1376,7 @@ static int wsrep_TOI_begin(THD *thd, char *db_, char *table_,
|
|||
uchar* buf(0);
|
||||
size_t buf_len(0);
|
||||
int buf_err;
|
||||
int rc= 0;
|
||||
|
||||
WSREP_DEBUG("TO BEGIN: %lld, %d : %s", (long long)wsrep_thd_trx_seqno(thd),
|
||||
thd->wsrep_exec_mode, thd->query() );
|
||||
|
@ -1406,7 +1416,6 @@ static int wsrep_TOI_begin(THD *thd, char *db_, char *table_,
|
|||
{
|
||||
thd->wsrep_exec_mode= TOTAL_ORDER;
|
||||
wsrep_to_isolation++;
|
||||
if (buf) my_free(buf);
|
||||
wsrep_keys_free(&key_arr);
|
||||
WSREP_DEBUG("TO BEGIN: %lld, %d",(long long)wsrep_thd_trx_seqno(thd),
|
||||
thd->wsrep_exec_mode);
|
||||
|
@ -1418,18 +1427,18 @@ static int wsrep_TOI_begin(THD *thd, char *db_, char *table_,
|
|||
ret, (thd->query()) ? thd->query() : "void");
|
||||
my_error(ER_LOCK_DEADLOCK, MYF(0), "WSREP replication failed. Check "
|
||||
"your wsrep connection state and retry the query.");
|
||||
if (buf) my_free(buf);
|
||||
wsrep_keys_free(&key_arr);
|
||||
return -1;
|
||||
rc= -1;
|
||||
}
|
||||
else {
|
||||
/* non replicated DDL, affecting temporary tables only */
|
||||
WSREP_DEBUG("TO isolation skipped for: %d, sql: %s."
|
||||
"Only temporary tables affected.",
|
||||
ret, (thd->query()) ? thd->query() : "void");
|
||||
return 1;
|
||||
rc= 1;
|
||||
}
|
||||
return 0;
|
||||
if (buf) my_free(buf);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void wsrep_TOI_end(THD *thd) {
|
||||
|
|
|
@ -7756,10 +7756,11 @@ no_commit:
|
|||
;
|
||||
} else if (src_table == prebuilt->table) {
|
||||
#ifdef WITH_WSREP
|
||||
if (wsrep_on(user_thd) && wsrep_load_data_splitting &&
|
||||
if (wsrep_on(user_thd) &&
|
||||
wsrep_load_data_splitting &&
|
||||
sql_command == SQLCOM_LOAD &&
|
||||
!thd_test_options(
|
||||
user_thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
|
||||
!thd_test_options(user_thd,
|
||||
OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
|
||||
{
|
||||
switch (wsrep_run_wsrep_commit(user_thd, 1))
|
||||
{
|
||||
|
@ -7787,10 +7788,11 @@ no_commit:
|
|||
prebuilt->sql_stat_start = TRUE;
|
||||
} else {
|
||||
#ifdef WITH_WSREP
|
||||
if (wsrep_on(user_thd) && wsrep_load_data_splitting &&
|
||||
if (wsrep_on(user_thd) &&
|
||||
wsrep_load_data_splitting &&
|
||||
sql_command == SQLCOM_LOAD &&
|
||||
!thd_test_options(
|
||||
user_thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
|
||||
!thd_test_options(user_thd,
|
||||
OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
|
||||
{
|
||||
switch (wsrep_run_wsrep_commit(user_thd, 1))
|
||||
{
|
||||
|
@ -8012,14 +8014,15 @@ report_error:
|
|||
user_thd);
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
if (!error_result && wsrep_thd_exec_mode(user_thd) == LOCAL_STATE &&
|
||||
wsrep_on(user_thd) && !wsrep_consistency_check(user_thd) &&
|
||||
(sql_command != SQLCOM_LOAD ||
|
||||
thd_binlog_format(user_thd) == BINLOG_FORMAT_ROW)) {
|
||||
|
||||
if (wsrep_append_keys(user_thd, false, record, NULL)) {
|
||||
DBUG_PRINT("wsrep", ("row key failed"));
|
||||
error_result = HA_ERR_INTERNAL_ERROR;
|
||||
if (!error_result &&
|
||||
wsrep_thd_exec_mode(user_thd) == LOCAL_STATE &&
|
||||
wsrep_on(user_thd) &&
|
||||
!wsrep_consistency_check(user_thd))
|
||||
{
|
||||
if (wsrep_append_keys(user_thd, false, record, NULL))
|
||||
{
|
||||
DBUG_PRINT("wsrep", ("row key failed"));
|
||||
error_result = HA_ERR_INTERNAL_ERROR;
|
||||
goto wsrep_error;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8211,10 +8211,11 @@ no_commit:
|
|||
;
|
||||
} else if (src_table == prebuilt->table) {
|
||||
#ifdef WITH_WSREP
|
||||
if (wsrep_on(user_thd) && wsrep_load_data_splitting &&
|
||||
if (wsrep_on(user_thd) &&
|
||||
wsrep_load_data_splitting &&
|
||||
sql_command == SQLCOM_LOAD &&
|
||||
!thd_test_options(
|
||||
user_thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
|
||||
!thd_test_options(user_thd,
|
||||
OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
|
||||
{
|
||||
switch (wsrep_run_wsrep_commit(user_thd, 1))
|
||||
{
|
||||
|
@ -8242,10 +8243,11 @@ no_commit:
|
|||
prebuilt->sql_stat_start = TRUE;
|
||||
} else {
|
||||
#ifdef WITH_WSREP
|
||||
if (wsrep_on(user_thd) && wsrep_load_data_splitting &&
|
||||
if (wsrep_on(user_thd) &&
|
||||
wsrep_load_data_splitting &&
|
||||
sql_command == SQLCOM_LOAD &&
|
||||
!thd_test_options(
|
||||
user_thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
|
||||
!thd_test_options(user_thd,
|
||||
OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
|
||||
{
|
||||
switch (wsrep_run_wsrep_commit(user_thd, 1))
|
||||
{
|
||||
|
@ -8476,14 +8478,15 @@ report_error:
|
|||
user_thd);
|
||||
|
||||
#ifdef WITH_WSREP
|
||||
if (!error_result && wsrep_thd_exec_mode(user_thd) == LOCAL_STATE &&
|
||||
wsrep_on(user_thd) && !wsrep_consistency_check(user_thd) &&
|
||||
(sql_command != SQLCOM_LOAD ||
|
||||
thd_binlog_format(user_thd) == BINLOG_FORMAT_ROW)) {
|
||||
|
||||
if (wsrep_append_keys(user_thd, false, record, NULL)) {
|
||||
DBUG_PRINT("wsrep", ("row key failed"));
|
||||
error_result = HA_ERR_INTERNAL_ERROR;
|
||||
if (!error_result &&
|
||||
wsrep_thd_exec_mode(user_thd) == LOCAL_STATE &&
|
||||
wsrep_on(user_thd) &&
|
||||
!wsrep_consistency_check(user_thd))
|
||||
{
|
||||
if (wsrep_append_keys(user_thd, false, record, NULL))
|
||||
{
|
||||
DBUG_PRINT("wsrep", ("row key failed"));
|
||||
error_result = HA_ERR_INTERNAL_ERROR;
|
||||
goto wsrep_error;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue