Merge branch '10.0-galera' into 10.1

This commit is contained in:
Sergei Golubchik 2015-09-03 16:32:00 +02:00
commit a5b0a32ac3
16 changed files with 566 additions and 54 deletions

View file

@ -11,6 +11,10 @@
# Don't write these queries to binlog # Don't write these queries to binlog
set SQL_LOG_BIN=0; 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 # Turn off any debug crashes, allow the variable to be
# non existent in release builds # non existent in release builds
--error 0,1193 --error 0,1193

View file

@ -20,4 +20,121 @@ pk i
SELECT * FROM t1; SELECT * FROM t1;
pk i pk i
DROP TABLE t1; 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 # End of test

View 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

View file

@ -4,4 +4,49 @@
USE test; USE test;
CREATE DEFINER=CURRENT_USER VIEW v1 AS SELECT 1; CREATE DEFINER=CURRENT_USER VIEW v1 AS SELECT 1;
DROP VIEW v1; 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 # End of tests

View file

@ -33,7 +33,7 @@ push @::global_suppressions,
qr(WSREP: last inactive check more than .* skipping check), qr(WSREP: last inactive check more than .* skipping check),
qr(WSREP: SQL statement was ineffective), qr(WSREP: SQL statement was ineffective),
qr(WSREP: Releasing seqno [0-9]* before [0-9]* was assigned.), 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: Quorum: No node with complete state),
qr(WSREP: Initial position was provided by configuration or SST, avoiding override), qr(WSREP: Initial position was provided by configuration or SST, avoiding override),
qr|WSREP: discarding established \(time wait\) .*|, qr|WSREP: discarding established \(time wait\) .*|,

View file

@ -30,7 +30,7 @@ CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB;
exit(0); exit(0);
EOF 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); INSERT INTO t1 VALUES (1);
--echo Resuming node_2 ... --echo Resuming node_2 ...

View file

@ -27,5 +27,181 @@ SELECT * FROM t1;
# Cleanup # Cleanup
DROP TABLE t1; 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 --source include/galera_end.inc
--echo # End of test --echo # End of test

View 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

View file

@ -8,4 +8,43 @@ USE test;
CREATE DEFINER=CURRENT_USER VIEW v1 AS SELECT 1; CREATE DEFINER=CURRENT_USER VIEW v1 AS SELECT 1;
DROP VIEW v1; 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 --echo # End of tests

View file

@ -25,9 +25,9 @@ return "No my_print_defaults" unless $epath;
push @::global_suppressions, push @::global_suppressions,
( (
qr(WSREP: Could not open saved state file for reading: ), qr(WSREP: Could not open saved state file for reading: ),
qr(WSREP: option --wsrep-casual-reads is deprecated), qr(WSREP: option --wsrep-causal-reads is deprecated),
qr(WSREP: --wsrep-casual-reads=ON takes precedence over --wsrep-sync-wait=0), 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\)|, qr|WSREP: access file\(.*gvwstate.dat\) failed\(No such file or directory\)|,
); );
$ENV{PATH}="$epath:$ENV{PATH}"; $ENV{PATH}="$epath:$ENV{PATH}";

View file

@ -51,7 +51,7 @@
#include "sql_connect.h" // decrease_user_connections, #include "sql_connect.h" // decrease_user_connections,
// check_mqh, // check_mqh,
// reset_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 "sql_tablespace.h" // mysql_alter_tablespace
#include "hostname.h" // hostname_cache_refresh #include "hostname.h" // hostname_cache_refresh
#include "sql_acl.h" // *_ACL, check_grant, is_acl_user, #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 void sql_kill_user(THD *thd, LEX_USER *user, killed_state state);
static bool lock_tables_precheck(THD *thd, TABLE_LIST *tables); static bool lock_tables_precheck(THD *thd, TABLE_LIST *tables);
static bool execute_show_status(THD *, TABLE_LIST *); 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 const char *any_db="*any*"; // Special symbol for check_access
@ -3589,8 +3589,12 @@ end_with_restore_list:
#endif /* HAVE_REPLICATION */ #endif /* HAVE_REPLICATION */
case SQLCOM_RENAME_TABLE: case SQLCOM_RENAME_TABLE:
{ {
if (check_rename_table(thd, first_table, all_tables))
goto error;
WSREP_TO_ISOLATION_BEGIN(0, 0, first_table) 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; goto error;
break; 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, static bool check_rename_table(THD *thd, TABLE_LIST *first_table,
TABLE_LIST *all_tables) TABLE_LIST *all_tables)
{ {
DBUG_ASSERT(first_table == all_tables && first_table != 0); DBUG_ASSERT(first_table == all_tables && first_table != 0);
TABLE_LIST *table; TABLE_LIST *table;
@ -5911,7 +5915,7 @@ static bool execute_rename_table(THD *thd, TABLE_LIST *first_table,
return 1; return 1;
} }
return mysql_rename_tables(thd, first_table, 0); return 0;
} }

View file

@ -531,6 +531,24 @@ bool Sql_cmd_alter_table_exchange_partition::
&alter_prelocking_strategy)) &alter_prelocking_strategy))
DBUG_RETURN(true); 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; part_table= table_list->table;
swap_table= swap_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 #ifdef WITH_WSREP
if (WSREP_ON) if (WSREP_ON)
{ {
/* Forward declaration */
TABLE *find_temporary_table(THD *thd, const TABLE_LIST *tl); TABLE *find_temporary_table(THD *thd, const TABLE_LIST *tl);
if ((!thd->is_current_stmt_binlog_format_row() || 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) 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); DBUG_RETURN(TRUE);
} }
} }

View file

@ -2196,8 +2196,11 @@ static void store_key_options(THD *thd, String *packet, TABLE *table,
void void
view_store_options(THD *thd, TABLE_LIST *table, String *buff) view_store_options(THD *thd, TABLE_LIST *table, String *buff)
{ {
buff->append(STRING_WITH_LEN("ALGORITHM=")); if (table->algorithm != VIEW_ALGORITHM_INHERIT)
buff->append(view_algorithm(table)); {
buff->append(STRING_WITH_LEN("ALGORITHM="));
buff->append(view_algorithm(table));
}
buff->append(' '); buff->append(' ');
append_definer(thd, buff, &table->definer.user, &table->definer.host); append_definer(thd, buff, &table->definer.user, &table->definer.host);
if (table->view_suid) if (table->view_suid)

View file

@ -1298,7 +1298,13 @@ create_view_query(THD *thd, uchar** buf, size_t* buf_len)
buff.append(command[thd->lex->create_view_mode].str, buff.append(command[thd->lex->create_view_mode].str,
command[thd->lex->create_view_mode].length); 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 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 If this is an ALTER VIEW then the current user should be set as
the definer. the definer.
*/ */
definer= create_default_definer(thd, false);
}
if (!(lex->definer= create_default_definer(thd, false))) if (definer)
{ {
WSREP_WARN("view default definer issue"); 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->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->view_suid = lex->create_view_suid;
views->with_check = lex->create_view_check; 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); uchar* buf(0);
size_t buf_len(0); size_t buf_len(0);
int buf_err; int buf_err;
int rc= 0;
WSREP_DEBUG("TO BEGIN: %lld, %d : %s", (long long)wsrep_thd_trx_seqno(thd), WSREP_DEBUG("TO BEGIN: %lld, %d : %s", (long long)wsrep_thd_trx_seqno(thd),
thd->wsrep_exec_mode, thd->query() ); 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; thd->wsrep_exec_mode= TOTAL_ORDER;
wsrep_to_isolation++; wsrep_to_isolation++;
if (buf) my_free(buf);
wsrep_keys_free(&key_arr); wsrep_keys_free(&key_arr);
WSREP_DEBUG("TO BEGIN: %lld, %d",(long long)wsrep_thd_trx_seqno(thd), WSREP_DEBUG("TO BEGIN: %lld, %d",(long long)wsrep_thd_trx_seqno(thd),
thd->wsrep_exec_mode); 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"); ret, (thd->query()) ? thd->query() : "void");
my_error(ER_LOCK_DEADLOCK, MYF(0), "WSREP replication failed. Check " my_error(ER_LOCK_DEADLOCK, MYF(0), "WSREP replication failed. Check "
"your wsrep connection state and retry the query."); "your wsrep connection state and retry the query.");
if (buf) my_free(buf);
wsrep_keys_free(&key_arr); wsrep_keys_free(&key_arr);
return -1; rc= -1;
} }
else { else {
/* non replicated DDL, affecting temporary tables only */ /* non replicated DDL, affecting temporary tables only */
WSREP_DEBUG("TO isolation skipped for: %d, sql: %s." WSREP_DEBUG("TO isolation skipped for: %d, sql: %s."
"Only temporary tables affected.", "Only temporary tables affected.",
ret, (thd->query()) ? thd->query() : "void"); 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) { static void wsrep_TOI_end(THD *thd) {

View file

@ -7756,10 +7756,11 @@ no_commit:
; ;
} else if (src_table == prebuilt->table) { } else if (src_table == prebuilt->table) {
#ifdef WITH_WSREP #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 && sql_command == SQLCOM_LOAD &&
!thd_test_options( !thd_test_options(user_thd,
user_thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
{ {
switch (wsrep_run_wsrep_commit(user_thd, 1)) switch (wsrep_run_wsrep_commit(user_thd, 1))
{ {
@ -7787,10 +7788,11 @@ no_commit:
prebuilt->sql_stat_start = TRUE; prebuilt->sql_stat_start = TRUE;
} else { } else {
#ifdef WITH_WSREP #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 && sql_command == SQLCOM_LOAD &&
!thd_test_options( !thd_test_options(user_thd,
user_thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
{ {
switch (wsrep_run_wsrep_commit(user_thd, 1)) switch (wsrep_run_wsrep_commit(user_thd, 1))
{ {
@ -8012,14 +8014,15 @@ report_error:
user_thd); user_thd);
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (!error_result && wsrep_thd_exec_mode(user_thd) == LOCAL_STATE && if (!error_result &&
wsrep_on(user_thd) && !wsrep_consistency_check(user_thd) && wsrep_thd_exec_mode(user_thd) == LOCAL_STATE &&
(sql_command != SQLCOM_LOAD || wsrep_on(user_thd) &&
thd_binlog_format(user_thd) == BINLOG_FORMAT_ROW)) { !wsrep_consistency_check(user_thd))
{
if (wsrep_append_keys(user_thd, false, record, NULL)) { if (wsrep_append_keys(user_thd, false, record, NULL))
DBUG_PRINT("wsrep", ("row key failed")); {
error_result = HA_ERR_INTERNAL_ERROR; DBUG_PRINT("wsrep", ("row key failed"));
error_result = HA_ERR_INTERNAL_ERROR;
goto wsrep_error; goto wsrep_error;
} }
} }

View file

@ -8211,10 +8211,11 @@ no_commit:
; ;
} else if (src_table == prebuilt->table) { } else if (src_table == prebuilt->table) {
#ifdef WITH_WSREP #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 && sql_command == SQLCOM_LOAD &&
!thd_test_options( !thd_test_options(user_thd,
user_thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
{ {
switch (wsrep_run_wsrep_commit(user_thd, 1)) switch (wsrep_run_wsrep_commit(user_thd, 1))
{ {
@ -8242,10 +8243,11 @@ no_commit:
prebuilt->sql_stat_start = TRUE; prebuilt->sql_stat_start = TRUE;
} else { } else {
#ifdef WITH_WSREP #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 && sql_command == SQLCOM_LOAD &&
!thd_test_options( !thd_test_options(user_thd,
user_thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))
{ {
switch (wsrep_run_wsrep_commit(user_thd, 1)) switch (wsrep_run_wsrep_commit(user_thd, 1))
{ {
@ -8476,14 +8478,15 @@ report_error:
user_thd); user_thd);
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (!error_result && wsrep_thd_exec_mode(user_thd) == LOCAL_STATE && if (!error_result &&
wsrep_on(user_thd) && !wsrep_consistency_check(user_thd) && wsrep_thd_exec_mode(user_thd) == LOCAL_STATE &&
(sql_command != SQLCOM_LOAD || wsrep_on(user_thd) &&
thd_binlog_format(user_thd) == BINLOG_FORMAT_ROW)) { !wsrep_consistency_check(user_thd))
{
if (wsrep_append_keys(user_thd, false, record, NULL)) { if (wsrep_append_keys(user_thd, false, record, NULL))
DBUG_PRINT("wsrep", ("row key failed")); {
error_result = HA_ERR_INTERNAL_ERROR; DBUG_PRINT("wsrep", ("row key failed"));
error_result = HA_ERR_INTERNAL_ERROR;
goto wsrep_error; goto wsrep_error;
} }
} }