#At file:///home/sven/bzr/merge/6.0-rpl_from_5.1-rpl/
2705 Sven Sandberg 2008-08-25 [merge]
please ignore - temporary commit
modified:
mysql-test/extra/binlog_tests/database.test
mysql-test/suite/binlog/r/binlog_database.result
mysql-test/suite/rpl/r/rpl_row_create_table.result
mysql-test/suite/rpl/t/rpl_row_create_table.test
sql/handler.cc
sql/log.cc
sql/sql_class.cc
sql/sql_class.h
sql/sql_db.cc
sql/sql_insert.cc
sql/sql_parse.cc
sql/sql_show.cc
sql/sql_show.h
sql/sql_table.cc
=== modified file 'mysql-test/extra/binlog_tests/database.test'
--- a/mysql-test/extra/binlog_tests/database.test 2007-11-16 14:55:22 +0000
+++ b/mysql-test/extra/binlog_tests/database.test 2008-08-20 08:06:50 +0000
@@ -13,3 +13,18 @@ create trigger tr1 before insert on t1 f
create procedure sp1 (a int) insert into t1 values(a);
drop database testing_1;
source include/show_binlog_events.inc;
+
+# BUG#38773: DROP DATABASE cause switch to stmt-mode when there are
+# temporary tables open
+
+use test;
+reset master;
+create temporary table tt1 (a int);
+create table t1 (a int);
+insert into t1 values (1);
+disable_warnings;
+drop database if exists mysqltest1;
+enable_warnings;
+insert into t1 values (1);
+drop table tt1, t1;
+source include/show_binlog_events.inc;
=== modified file 'mysql-test/suite/binlog/r/binlog_database.result'
--- a/mysql-test/suite/binlog/r/binlog_database.result 2008-08-04 14:30:50 +0000
+++ b/mysql-test/suite/binlog/r/binlog_database.result 2008-08-25 08:13:32 +0000
@@ -17,6 +17,22 @@ master-bin.000001 # Query # # use `testi
master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost`
PROCEDURE `sp1`(a int)
insert into t1 values(a)
master-bin.000001 # Query # # drop database testing_1
+use test;
+reset master;
+create temporary table tt1 (a int);
+create table t1 (a int);
+insert into t1 values (1);
+drop database if exists mysqltest1;
+insert into t1 values (1);
+drop table tt1, t1;
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; create temporary table tt1 (a int)
+master-bin.000001 # Query # # use `test`; create table t1 (a int)
+master-bin.000001 # Query # # use `test`; insert into t1 values (1)
+master-bin.000001 # Query # # drop database if exists mysqltest1
+master-bin.000001 # Query # # use `test`; insert into t1 values (1)
+master-bin.000001 # Query # # use `test`; drop table tt1, t1
set binlog_format=mixed;
reset master;
create database testing_1;
@@ -36,6 +52,22 @@ master-bin.000001 # Query # # use `testi
master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost`
PROCEDURE `sp1`(a int)
insert into t1 values(a)
master-bin.000001 # Query # # drop database testing_1
+use test;
+reset master;
+create temporary table tt1 (a int);
+create table t1 (a int);
+insert into t1 values (1);
+drop database if exists mysqltest1;
+insert into t1 values (1);
+drop table tt1, t1;
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; create temporary table tt1 (a int)
+master-bin.000001 # Query # # use `test`; create table t1 (a int)
+master-bin.000001 # Query # # use `test`; insert into t1 values (1)
+master-bin.000001 # Query # # drop database if exists mysqltest1
+master-bin.000001 # Query # # use `test`; insert into t1 values (1)
+master-bin.000001 # Query # # use `test`; drop table tt1, t1
set binlog_format=row;
reset master;
create database testing_1;
@@ -55,6 +87,27 @@ master-bin.000001 # Query # # use `testi
master-bin.000001 # Query # # use `testing_1`; CREATE DEFINER=`root`@`localhost`
PROCEDURE `sp1`(a int)
insert into t1 values(a)
master-bin.000001 # Query # # drop database testing_1
+use test;
+reset master;
+create temporary table tt1 (a int);
+create table t1 (a int);
+insert into t1 values (1);
+drop database if exists mysqltest1;
+insert into t1 values (1);
+drop table tt1, t1;
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # use `test`; create table t1 (a int)
+master-bin.000001 # Query # # use `test`; BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # use `test`; COMMIT
+master-bin.000001 # Query # # drop database if exists mysqltest1
+master-bin.000001 # Query # # use `test`; BEGIN
+master-bin.000001 # Table_map # # table_id: # (test.t1)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # use `test`; COMMIT
+master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */
show databases;
Database
information_schema
=== modified file 'mysql-test/suite/rpl/r/rpl_row_create_table.result'
--- a/mysql-test/suite/rpl/r/rpl_row_create_table.result 2008-06-10 22:27:52 +0000
+++ b/mysql-test/suite/rpl/r/rpl_row_create_table.result 2008-08-25 08:13:32 +0000
@@ -430,4 +430,25 @@ a
1
2
DROP TABLE t1;
+stop slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+reset master;
+reset slave;
+drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
+start slave;
+CREATE DATABASE mysqltest1;
+CREATE TABLE mysqltest1.without_select (f1 BIGINT);
+CREATE TABLE mysqltest1.with_select AS SELECT 1 AS f1;
+show binlog events from <binlog_start>;
+Log_name Pos Event_type Server_id End_log_pos Info
+master-bin.000001 # Query # # CREATE DATABASE mysqltest1
+master-bin.000001 # Query # # use `test`; CREATE TABLE mysqltest1.without_select (f1
BIGINT)
+master-bin.000001 # Query # # use `test`; BEGIN
+master-bin.000001 # Query # # use `test`; CREATE TABLE `mysqltest1`.`with_select` (
+ `f1` int(1) NOT NULL DEFAULT '0'
+)
+master-bin.000001 # Table_map # # table_id: # (mysqltest1.with_select)
+master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
+master-bin.000001 # Query # # use `test`; COMMIT
+DROP DATABASE mysqltest1;
end of the tests
=== modified file 'mysql-test/suite/rpl/t/rpl_row_create_table.test'
--- a/mysql-test/suite/rpl/t/rpl_row_create_table.test 2008-06-22 20:05:19 +0000
+++ b/mysql-test/suite/rpl/t/rpl_row_create_table.test 2008-08-25 08:13:32 +0000
@@ -267,5 +267,22 @@ connection master;
DROP TABLE t1;
sync_slave_with_master;
+#
+# BUG#34707: Row based replication: slave creates table within wrong database
+#
+
+source include/master-slave-reset.inc;
+
+connection master;
+CREATE DATABASE mysqltest1;
+
+CREATE TABLE mysqltest1.without_select (f1 BIGINT);
+CREATE TABLE mysqltest1.with_select AS SELECT 1 AS f1;
+source include/show_binlog_events.inc;
+sync_slave_with_master;
+
+connection master;
+DROP DATABASE mysqltest1;
+sync_slave_with_master;
--echo end of the tests
=== modified file 'sql/handler.cc'
--- a/sql/handler.cc 2008-08-05 11:20:20 +0000
+++ b/sql/handler.cc 2008-08-25 08:13:32 +0000
@@ -5199,6 +5199,8 @@ static int write_locked_table_maps(THD *
DBUG_PRINT("enter", ("thd: %p thd->lock: %p thd->extra_lock: %p",
thd, thd->lock, thd->extra_lock));
+ DBUG_PRINT("debug", ("get_binlog_table_maps(): %d", thd->get_binlog_table_maps()));
+
if (thd->get_binlog_table_maps() == 0)
{
MYSQL_LOCK *locks[2];
=== modified file 'sql/log.cc'
--- a/sql/log.cc 2008-08-05 11:20:20 +0000
+++ b/sql/log.cc 2008-08-25 08:13:32 +0000
@@ -1392,6 +1392,8 @@ binlog_end_trans(THD *thd, binlog_trx_da
FLAGSTR(thd->options, OPTION_NOT_AUTOCOMMIT),
FLAGSTR(thd->options, OPTION_BEGIN)));
+ thd->binlog_flush_pending_rows_event(TRUE);
+
/*
NULL denotes ROLLBACK with nothing to replicate: i.e., rollback of
only transactional tables. If the transaction contain changes to
@@ -1410,8 +1412,6 @@ binlog_end_trans(THD *thd, binlog_trx_da
were, we would have to ensure that we're not ending a statement
inside a stored function.
*/
- thd->binlog_flush_pending_rows_event(TRUE);
-
error= mysql_bin_log.write(thd, &trx_data->trans_log, end_ev);
trx_data->reset();
=== modified file 'sql/sql_class.cc'
--- a/sql/sql_class.cc 2008-08-07 20:51:09 +0000
+++ b/sql/sql_class.cc 2008-08-25 08:13:32 +0000
@@ -3554,6 +3554,24 @@ int THD::binlog_flush_pending_rows_event
}
+static const char *
+show_query_type(THD::enum_binlog_query_type qtype)
+{
+ switch (qtype) {
+ case THD::ROW_QUERY_TYPE:
+ return "ROW";
+ case THD::STMT_QUERY_TYPE:
+ return "STMT";
+ case THD::MYSQL_QUERY_TYPE:
+ return "MYSQL";
+ }
+
+ static char buf[64];
+ sprintf(buf, "UNKNOWN#%d", qtype);
+ return buf;
+}
+
+
/*
Member function that will log query, either row-based or
statement-based depending on the value of the 'current_stmt_binlog_row_based'
@@ -3582,7 +3600,8 @@ int THD::binlog_query(THD::enum_binlog_q
THD::killed_state killed_status_arg)
{
DBUG_ENTER("THD::binlog_query");
- DBUG_PRINT("enter", ("qtype: %d query: '%s'", qtype, query_arg));
+ DBUG_PRINT("enter", ("qtype: %s query: '%s'",
+ show_query_type(qtype), query_arg));
DBUG_ASSERT(query_arg && mysql_bin_log.is_open());
/*
@@ -3621,6 +3640,9 @@ int THD::binlog_query(THD::enum_binlog_q
switch (qtype) {
case THD::ROW_QUERY_TYPE:
+ DBUG_PRINT("debug",
+ ("current_stmt_binlog_row_based: %d",
+ current_stmt_binlog_row_based));
if (current_stmt_binlog_row_based)
DBUG_RETURN(0);
/* Otherwise, we fall through */
=== modified file 'sql/sql_class.h'
--- a/sql/sql_class.h 2008-08-07 20:51:09 +0000
+++ b/sql/sql_class.h 2008-08-25 08:13:32 +0000
@@ -1070,6 +1070,21 @@ enum enum_thread_type
SYSTEM_THREAD_BACKUP= 64
};
+inline char const *
+show_system_thread(enum_thread_type thread)
+{
+#define RETURN_NAME_AS_STRING(NAME) case (NAME): return #NAME
+ switch (thread) {
+ RETURN_NAME_AS_STRING(NON_SYSTEM_THREAD);
+ RETURN_NAME_AS_STRING(SYSTEM_THREAD_DELAYED_INSERT);
+ RETURN_NAME_AS_STRING(SYSTEM_THREAD_SLAVE_IO);
+ RETURN_NAME_AS_STRING(SYSTEM_THREAD_SLAVE_SQL);
+ RETURN_NAME_AS_STRING(SYSTEM_THREAD_NDBCLUSTER_BINLOG);
+ RETURN_NAME_AS_STRING(SYSTEM_THREAD_EVENT_SCHEDULER);
+ RETURN_NAME_AS_STRING(SYSTEM_THREAD_EVENT_WORKER);
+ }
+#undef RETURN_NAME_AS_STRING
+}
/**
This class represents the interface for internal error handlers.
@@ -2261,6 +2276,10 @@ public:
Don't reset binlog format for NDB binlog injector thread.
*/
+ DBUG_PRINT("debug",
+ ("temporary_tables: %d, in_sub_stmt: %d, system_thread: %s",
+ (int) temporary_tables, in_sub_stmt,
+ show_system_thread(system_thread)));
if ((temporary_tables == NULL) && (in_sub_stmt == 0) &&
(system_thread != SYSTEM_THREAD_NDBCLUSTER_BINLOG))
{
=== modified file 'sql/sql_db.cc'
--- a/sql/sql_db.cc 2008-07-22 14:16:22 +0000
+++ b/sql/sql_db.cc 2008-08-25 08:13:32 +0000
@@ -883,13 +883,6 @@ bool mysql_rm_db(THD *thd,char *db,bool
pthread_mutex_lock(&LOCK_mysql_create_db);
- /*
- This statement will be replicated as a statement, even when using
- row-based replication. The flag will be reset at the end of the
- statement.
- */
- thd->clear_current_stmt_binlog_row_based();
-
length= build_table_filename(path, sizeof(path), db, "", "", 0);
strmov(path+length, MY_DB_OPT_FILE); // Append db option file name
del_dbopt(path); // Remove dboption hash entry
@@ -911,6 +904,20 @@ bool mysql_rm_db(THD *thd,char *db,bool
else
{
error= -1;
+ /*
+ We temporarily disable the binary log while dropping the objects
+ in the database. Since the DROP DATABASE statement is always
+ replicated as a statement, execution of it will drop all objects
+ in the database on the slave as well, so there is no need to
+ replicate the removal of the individual objects in the database
+ as well.
+
+ This is more of a safety precaution, since normally no objects
+ should be dropped while the database is being cleaned, but in
+ the event that a change in the code to remove other objects is
+ made, these drops should still not be logged.
+ */
+ tmp_disable_binlog(thd);
if ((deleted= mysql_rm_known_files(thd, dirp, db, path, 0,
&dropped_tables)) >= 0)
{
@@ -922,6 +929,7 @@ bool mysql_rm_db(THD *thd,char *db,bool
#endif
error = 0;
}
+ reenable_binlog(thd);
}
if (!silent && deleted>=0)
{
=== modified file 'sql/sql_insert.cc'
--- a/sql/sql_insert.cc 2008-07-22 14:16:22 +0000
+++ b/sql/sql_insert.cc 2008-08-25 08:13:32 +0000
@@ -3682,7 +3682,8 @@ select_create::binlog_show_create_table(
tmp_table_list.table = *tables;
query.length(0); // Have to zero it since constructor doesn't
- result= store_create_info(thd, &tmp_table_list, &query, create_info);
+ result= store_create_info(thd, &tmp_table_list, &query, create_info,
+ /* show_database */ TRUE);
DBUG_ASSERT(result == 0); /* store_create_info() always return 0 */
thd->binlog_query(THD::STMT_QUERY_TYPE,
=== modified file 'sql/sql_parse.cc'
--- a/sql/sql_parse.cc 2008-08-22 17:03:15 +0000
+++ b/sql/sql_parse.cc 2008-08-25 08:13:32 +0000
@@ -5654,6 +5654,10 @@ void mysql_reset_thd_for_next_command(TH
*/
thd->reset_current_stmt_binlog_row_based();
+ DBUG_PRINT("debug",
+ ("current_stmt_binlog_row_based: %d",
+ thd->current_stmt_binlog_row_based));
+
DBUG_VOID_RETURN;
}
=== modified file 'sql/sql_show.cc'
--- a/sql/sql_show.cc 2008-08-05 11:20:20 +0000
+++ b/sql/sql_show.cc 2008-08-25 08:13:32 +0000
@@ -541,7 +541,8 @@ mysqld_show_create(THD *thd, TABLE_LIST
if ((table_list->view ?
view_store_create_info(thd, table_list, &buffer) :
- store_create_info(thd, table_list, &buffer, NULL)))
+ store_create_info(thd, table_list, &buffer, NULL,
+ FALSE /* show_database */)))
DBUG_RETURN(TRUE);
List<Item> field_list;
@@ -698,6 +699,37 @@ mysqld_list_fields(THD *thd, TABLE_LIST
}
+|<<<<<<< TREE
+|=======
+int
+mysqld_dump_create_info(THD *thd, TABLE_LIST *table_list, int fd)
+{
+ Protocol *protocol= thd->protocol;
+ String *packet= protocol->storage_packet();
+ DBUG_ENTER("mysqld_dump_create_info");
+ DBUG_PRINT("enter",("table: %s",table_list->table->s->table_name.str));
+
+ protocol->prepare_for_resend();
+ if (store_create_info(thd, table_list, packet, NULL,
+ FALSE /* show_database */))
+ DBUG_RETURN(-1);
+
+ if (fd < 0)
+ {
+ if (protocol->write())
+ DBUG_RETURN(-1);
+ protocol->flush();
+ }
+ else
+ {
+ if (my_write(fd, (const uchar*) packet->ptr(), packet->length(),
+ MYF(MY_WME)))
+ DBUG_RETURN(-1);
+ }
+ DBUG_RETURN(0);
+}
+
+|>>>>>>> MERGE-SOURCE
/*
Go through all character combinations and ensure that sql_lex.cc can
parse it as an identifier.
@@ -932,7 +964,7 @@ static bool get_field_default_value(THD
*/
int store_create_info(THD *thd, TABLE_LIST *table_list, String *packet,
- HA_CREATE_INFO *create_info_arg)
+ HA_CREATE_INFO *create_info_arg, bool show_database)
{
List<Item> field_list;
char tmp[MAX_FIELD_WIDTH], *for_str, buff[128], def_value_buf[MAX_FIELD_WIDTH];
@@ -980,6 +1012,25 @@ int store_create_info(THD *thd, TABLE_LI
alias= share->table_name.str;
}
}
+
+ /*
+ Print the database before the table name if told to do that. The
+ database name is only printed in the event that it is different
+ from the current database. The main reason for doing this is to
+ avoid having to update gazillions of tests and result files, but
+ it also saves a few bytes of the binary log.
+ */
+ if (show_database)
+ {
+ const LEX_STRING *const db=
+ table_list->schema_table ? &INFORMATION_SCHEMA_NAME :
&table->s->db;
+ if (strcmp(db->str, thd->db) != 0)
+ {
+ append_identifier(thd, packet, db->str, db->length);
+ packet->append(STRING_WITH_LEN("."));
+ }
+ }
+
append_identifier(thd, packet, alias, strlen(alias));
packet->append(STRING_WITH_LEN(" (\n"));
/*
=== modified file 'sql/sql_show.h'
--- a/sql/sql_show.h 2008-01-14 19:49:27 +0000
+++ b/sql/sql_show.h 2008-08-25 08:13:32 +0000
@@ -33,9 +33,13 @@ find_files_result find_files(THD *thd, L
const char *path, const char *wild, bool dir);
int store_create_info(THD *thd, TABLE_LIST *table_list, String *packet,
+|<<<<<<< TREE
HA_CREATE_INFO *create_info_arg);
bool store_db_create_info(THD *thd, const char *dbname, String *buffer,
HA_CREATE_INFO *create_info);
+|=======
+ HA_CREATE_INFO *create_info_arg, bool show_database);
+|>>>>>>> MERGE-SOURCE
int view_store_create_info(THD *thd, TABLE_LIST *table, String *buff);
int copy_event_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table);
=== modified file 'sql/sql_table.cc'
--- a/sql/sql_table.cc 2008-08-05 11:20:20 +0000
+++ b/sql/sql_table.cc 2008-08-25 08:13:32 +0000
@@ -4929,8 +4929,9 @@ bool mysql_create_like_table(THD* thd, T
MYSQL_OPEN_REOPEN))
goto err;
- IF_DBUG(int result=) store_create_info(thd, table, &query,
- create_info);
+ IF_DBUG(int result=)
+ store_create_info(thd, table, &query,
+ create_info, FALSE /* show_database */);
DBUG_ASSERT(result == 0); // store_create_info() always return 0
write_bin_log(thd, TRUE, query.ptr(), query.length());
| Thread |
|---|
| • bzr commit into mysql-6.0 branch (sven:2705) Bug#34707 Bug#38773 | Sven Sandberg | 25 Aug |