diff options
author | Sergei Golubchik <serg@mariadb.org> | 2015-09-03 16:32:00 +0200 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2015-09-03 16:32:00 +0200 |
commit | a5b0a32ac3f8278a197add2efa636c6252ce6096 (patch) | |
tree | 006ccc320544e04be6beca0e929eb9f9d8e36bcd | |
parent | 09307c443c173fc2756169290b6ce0ba2f679b9a (diff) | |
parent | f533b2b462b5b73630245172b627506d36f95b39 (diff) | |
download | mariadb-git-a5b0a32ac3f8278a197add2efa636c6252ce6096.tar.gz |
Merge branch '10.0-galera' into 10.1
-rw-r--r-- | mysql-test/include/check-warnings.test | 4 | ||||
-rw-r--r-- | mysql-test/suite/galera/r/partition.result | 117 | ||||
-rw-r--r-- | mysql-test/suite/galera/r/rename.result | 38 | ||||
-rw-r--r-- | mysql-test/suite/galera/r/view.result | 45 | ||||
-rw-r--r-- | mysql-test/suite/galera/suite.pm | 2 | ||||
-rw-r--r-- | mysql-test/suite/galera/t/galera_suspend_slave.test | 2 | ||||
-rw-r--r-- | mysql-test/suite/galera/t/partition.test | 176 | ||||
-rw-r--r-- | mysql-test/suite/galera/t/rename.test | 52 | ||||
-rw-r--r-- | mysql-test/suite/galera/t/view.test | 39 | ||||
-rw-r--r-- | mysql-test/suite/wsrep/suite.pm | 6 | ||||
-rw-r--r-- | sql/sql_parse.cc | 16 | ||||
-rw-r--r-- | sql/sql_partition_admin.cc | 21 | ||||
-rw-r--r-- | sql/sql_show.cc | 7 | ||||
-rw-r--r-- | sql/wsrep_mysqld.cc | 33 | ||||
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 31 | ||||
-rw-r--r-- | storage/xtradb/handler/ha_innodb.cc | 31 |
16 files changed, 566 insertions, 54 deletions
diff --git a/mysql-test/include/check-warnings.test b/mysql-test/include/check-warnings.test index 9ecf7de419a..b2f73c32e35 100644 --- a/mysql-test/include/check-warnings.test +++ b/mysql-test/include/check-warnings.test @@ -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 diff --git a/mysql-test/suite/galera/r/partition.result b/mysql-test/suite/galera/r/partition.result index 60fb2ed298d..3907b4f08c9 100644 --- a/mysql-test/suite/galera/r/partition.result +++ b/mysql-test/suite/galera/r/partition.result @@ -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 diff --git a/mysql-test/suite/galera/r/rename.result b/mysql-test/suite/galera/r/rename.result new file mode 100644 index 00000000000..f13d3f13b24 --- /dev/null +++ b/mysql-test/suite/galera/r/rename.result @@ -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 diff --git a/mysql-test/suite/galera/r/view.result b/mysql-test/suite/galera/r/view.result index 89e2355b4dc..06d7bf072e8 100644 --- a/mysql-test/suite/galera/r/view.result +++ b/mysql-test/suite/galera/r/view.result @@ -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 diff --git a/mysql-test/suite/galera/suite.pm b/mysql-test/suite/galera/suite.pm index db8e8f7ff36..28163d62ef1 100644 --- a/mysql-test/suite/galera/suite.pm +++ b/mysql-test/suite/galera/suite.pm @@ -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\) .*|, diff --git a/mysql-test/suite/galera/t/galera_suspend_slave.test b/mysql-test/suite/galera/t/galera_suspend_slave.test index ac3fdf0ef40..236c65b73a7 100644 --- a/mysql-test/suite/galera/t/galera_suspend_slave.test +++ b/mysql-test/suite/galera/t/galera_suspend_slave.test @@ -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 ... diff --git a/mysql-test/suite/galera/t/partition.test b/mysql-test/suite/galera/t/partition.test index 048f35a9282..bb5a02411c3 100644 --- a/mysql-test/suite/galera/t/partition.test +++ b/mysql-test/suite/galera/t/partition.test @@ -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 diff --git a/mysql-test/suite/galera/t/rename.test b/mysql-test/suite/galera/t/rename.test new file mode 100644 index 00000000000..27811678bf5 --- /dev/null +++ b/mysql-test/suite/galera/t/rename.test @@ -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 + diff --git a/mysql-test/suite/galera/t/view.test b/mysql-test/suite/galera/t/view.test index 6768917589c..fa2cd8b2a67 100644 --- a/mysql-test/suite/galera/t/view.test +++ b/mysql-test/suite/galera/t/view.test @@ -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 + diff --git a/mysql-test/suite/wsrep/suite.pm b/mysql-test/suite/wsrep/suite.pm index 33744a60ad8..ec7a3e374f5 100644 --- a/mysql-test/suite/wsrep/suite.pm +++ b/mysql-test/suite/wsrep/suite.pm @@ -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}"; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 8567587a48a..c09f13b1844 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -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; } diff --git a/sql/sql_partition_admin.cc b/sql/sql_partition_admin.cc index 99bc161501e..e237fb1ad00 100644 --- a/sql/sql_partition_admin.cc +++ b/sql/sql_partition_admin.cc @@ -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); } } diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 28e623f3af1..78d4575a51e 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -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) diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 93de43b246f..e74c898dd95 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -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) { diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 309b6042771..c1624ed0663 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -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; } } diff --git a/storage/xtradb/handler/ha_innodb.cc b/storage/xtradb/handler/ha_innodb.cc index a80c74cd1fd..a549b77f8ed 100644 --- a/storage/xtradb/handler/ha_innodb.cc +++ b/storage/xtradb/handler/ha_innodb.cc @@ -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; } } |