mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 11:01:52 +01:00
Merge mysql.com:/users/lthalmann/bkroot/mysql-4.1
into mysql.com:/users/lthalmann/bk/mysql-4.1-bug12542
This commit is contained in:
commit
9d8f51fe3a
4 changed files with 95 additions and 28 deletions
|
@ -29,3 +29,14 @@ drop table if exists t1,t2,t11;
|
|||
show slave status;
|
||||
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master
|
||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 1340 slave-relay-bin.000002 1384 master-bin.000001 Yes Yes test.t1 0 0 1340 1384 None 0 No #
|
||||
create table t1 (ts timestamp);
|
||||
set one_shot time_zone='met';
|
||||
insert into t1 values('2005-08-12 00:00:00');
|
||||
set one_shot time_zone='met';
|
||||
select * from t1;
|
||||
ts
|
||||
2005-08-12 00:00:00
|
||||
set one_shot time_zone='met';
|
||||
select * from t1;
|
||||
ts
|
||||
2005-08-12 00:00:00
|
||||
|
|
|
@ -36,4 +36,22 @@ sync_with_master;
|
|||
--replace_column 1 # 33 #
|
||||
show slave status;
|
||||
|
||||
#
|
||||
# BUG#12542
|
||||
# TEST: "SET ONE_SHOT should always be executed on slave"
|
||||
#
|
||||
# We could use any timezone different than server default in this test
|
||||
#
|
||||
connection master;
|
||||
create table t1 (ts timestamp);
|
||||
set one_shot time_zone='met';
|
||||
insert into t1 values('2005-08-12 00:00:00');
|
||||
set one_shot time_zone='met';
|
||||
select * from t1;
|
||||
sync_slave_with_master;
|
||||
|
||||
connection slave;
|
||||
set one_shot time_zone='met';
|
||||
select * from t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
|
|
@ -1008,6 +1008,16 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
|
|||
#endif
|
||||
clear_all_errors(thd, rli);
|
||||
|
||||
/*
|
||||
Note: We do not need to execute reset_one_shot_variables() if this
|
||||
db_ok() test fails.
|
||||
Reason: The db stored in binlog events is the same for SET and for
|
||||
its companion query. If the SET is ignored because of
|
||||
db_ok(), the companion query will also be ignored, and if
|
||||
the companion query is ignored in the db_ok() test of
|
||||
::exec_event(), then the companion SET also have so we
|
||||
don't need to reset_one_shot_variables().
|
||||
*/
|
||||
if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
|
||||
{
|
||||
thd->set_time((time_t)when);
|
||||
|
@ -1762,6 +1772,16 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
|||
Create_file_log_event::exec_event() and then discarding Append_block and
|
||||
al. Another way is do the filtering in the I/O thread (more efficient: no
|
||||
disk writes at all).
|
||||
|
||||
|
||||
Note: We do not need to execute reset_one_shot_variables() if this
|
||||
db_ok() test fails.
|
||||
Reason: The db stored in binlog events is the same for SET and for
|
||||
its companion query. If the SET is ignored because of
|
||||
db_ok(), the companion query will also be ignored, and if
|
||||
the companion query is ignored in the db_ok() test of
|
||||
::exec_event(), then the companion SET also have so we
|
||||
don't need to reset_one_shot_variables().
|
||||
*/
|
||||
if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
|
||||
{
|
||||
|
|
|
@ -120,6 +120,9 @@ static bool end_active_trans(THD *thd)
|
|||
|
||||
|
||||
#ifdef HAVE_REPLICATION
|
||||
/*
|
||||
Returns true if all tables should be ignored
|
||||
*/
|
||||
inline bool all_tables_not_ok(THD *thd, TABLE_LIST *tables)
|
||||
{
|
||||
return (table_rules_on && tables && !tables_ok(thd,tables) &&
|
||||
|
@ -1915,6 +1918,23 @@ bool alloc_query(THD *thd, char *packet, ulong packet_length)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void reset_one_shot_variables(THD *thd)
|
||||
{
|
||||
thd->variables.character_set_client=
|
||||
global_system_variables.character_set_client;
|
||||
thd->variables.collation_connection=
|
||||
global_system_variables.collation_connection;
|
||||
thd->variables.collation_database=
|
||||
global_system_variables.collation_database;
|
||||
thd->variables.collation_server=
|
||||
global_system_variables.collation_server;
|
||||
thd->update_charset();
|
||||
thd->variables.time_zone=
|
||||
global_system_variables.time_zone;
|
||||
thd->one_shot_set= 0;
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
** mysql_execute_command
|
||||
** Execute command saved in thd and current_lex->sql_command
|
||||
|
@ -1975,16 +1995,22 @@ mysql_execute_command(THD *thd)
|
|||
/*
|
||||
Skip if we are in the slave thread, some table rules have been
|
||||
given and the table list says the query should not be replicated.
|
||||
Exception is DROP TEMPORARY TABLE IF EXISTS: we always execute it
|
||||
(otherwise we have stale files on slave caused by exclusion of one tmp
|
||||
table).
|
||||
|
||||
Exceptions are:
|
||||
- SET: we always execute it (Not that many SET commands exists in
|
||||
the binary log anyway -- only 4.1 masters write SET statements,
|
||||
in 5.0 there are no SET statements in the binary log)
|
||||
- DROP TEMPORARY TABLE IF EXISTS: we always execute it (otherwise we
|
||||
have stale files on slave caused by exclusion of one tmp table).
|
||||
*/
|
||||
if (!(lex->sql_command == SQLCOM_DROP_TABLE &&
|
||||
if (!(lex->sql_command == SQLCOM_SET_OPTION) &&
|
||||
!(lex->sql_command == SQLCOM_DROP_TABLE &&
|
||||
lex->drop_temporary && lex->drop_if_exists) &&
|
||||
all_tables_not_ok(thd,tables))
|
||||
{
|
||||
/* we warn the slave SQL thread */
|
||||
my_error(ER_SLAVE_IGNORED_TABLE, MYF(0));
|
||||
reset_one_shot_variables(thd);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
#ifndef TO_BE_DELETED
|
||||
|
@ -3309,6 +3335,7 @@ purposes internal to the MySQL server", MYF(0));
|
|||
!db_ok_with_wild_table(lex->name)))
|
||||
{
|
||||
my_error(ER_SLAVE_IGNORED_TABLE, MYF(0));
|
||||
reset_one_shot_variables(thd);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
@ -3344,6 +3371,7 @@ purposes internal to the MySQL server", MYF(0));
|
|||
!db_ok_with_wild_table(lex->name)))
|
||||
{
|
||||
my_error(ER_SLAVE_IGNORED_TABLE, MYF(0));
|
||||
reset_one_shot_variables(thd);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
@ -3384,6 +3412,7 @@ purposes internal to the MySQL server", MYF(0));
|
|||
!db_ok_with_wild_table(db)))
|
||||
{
|
||||
my_error(ER_SLAVE_IGNORED_TABLE, MYF(0));
|
||||
reset_one_shot_variables(thd);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
@ -3718,30 +3747,19 @@ purposes internal to the MySQL server", MYF(0));
|
|||
break;
|
||||
}
|
||||
thd->proc_info="query end"; // QQ
|
||||
if (thd->one_shot_set)
|
||||
{
|
||||
/*
|
||||
If this is a SET, do nothing. This is to allow mysqlbinlog to print
|
||||
many SET commands (in this case we want the charset temp setting to
|
||||
live until the real query). This is also needed so that SET
|
||||
CHARACTER_SET_CLIENT... does not cancel itself immediately.
|
||||
*/
|
||||
if (lex->sql_command != SQLCOM_SET_OPTION)
|
||||
{
|
||||
thd->variables.character_set_client=
|
||||
global_system_variables.character_set_client;
|
||||
thd->variables.collation_connection=
|
||||
global_system_variables.collation_connection;
|
||||
thd->variables.collation_database=
|
||||
global_system_variables.collation_database;
|
||||
thd->variables.collation_server=
|
||||
global_system_variables.collation_server;
|
||||
thd->update_charset();
|
||||
thd->variables.time_zone=
|
||||
global_system_variables.time_zone;
|
||||
thd->one_shot_set= 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Reset system variables temporarily modified by SET ONE SHOT.
|
||||
|
||||
Exception: If this is a SET, do nothing. This is to allow
|
||||
mysqlbinlog to print many SET commands (in this case we want the
|
||||
charset temp setting to live until the real query). This is also
|
||||
needed so that SET CHARACTER_SET_CLIENT... does not cancel itself
|
||||
immediately.
|
||||
*/
|
||||
if (thd->one_shot_set && lex->sql_command != SQLCOM_SET_OPTION)
|
||||
reset_one_shot_variables(thd);
|
||||
|
||||
if (res < 0)
|
||||
send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN : 0);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue