mirror of
https://github.com/MariaDB/server.git
synced 2025-08-31 22:22:30 +03:00

Binlog lacks encoding info about DROPped temporary table. Idea of the fix is to switch temporary to system_charset_info when a temporary table is DROPped for binlog. Since that is the server, that automatically, but not the client, who generates the query the binlog should be updated on the server's encoding for the coming DROP. The `write_binlog_with_system_charset()' is introduced to replace similar problematic places in the code.
172 lines
4.8 KiB
Plaintext
172 lines
4.8 KiB
Plaintext
source include/master-slave.inc;
|
||
|
||
# Clean up old slave's binlogs.
|
||
# The slave is started with --log-slave-updates
|
||
# and this test does SHOW BINLOG EVENTS on the slave's
|
||
# binlog. But previous tests can influence the current test's
|
||
# binlog (e.g. a temporary table in the previous test has not
|
||
# been explicitly deleted, or it has but the slave hasn't had
|
||
# enough time to catch it before STOP SLAVE,
|
||
# and at the beginning of the current
|
||
# test the slave immediately writes DROP TEMPORARY TABLE this_old_table).
|
||
# We wait for the slave to have written all he wants to the binlog
|
||
# (otherwise RESET MASTER may come too early).
|
||
save_master_pos;
|
||
connection slave;
|
||
sync_with_master;
|
||
reset master;
|
||
connection master;
|
||
|
||
connect (con1,localhost,root,,);
|
||
connect (con2,localhost,root,,);
|
||
# We want to connect as an unprivileged user. But if we use user="" then this
|
||
# will pick the Unix login, which will cause problems if you're running the test
|
||
# as root.
|
||
connect (con3,localhost,zedjzlcsjhd,,);
|
||
|
||
# We are going to use SET PSEUDO_THREAD_ID in this test;
|
||
# check that it requires the SUPER privilege.
|
||
|
||
connection con3;
|
||
SET @save_select_limit=@@session.sql_select_limit;
|
||
--error 1227
|
||
SET @@session.sql_select_limit=10, @@session.pseudo_thread_id=100;
|
||
SELECT @@session.sql_select_limit = @save_select_limit; #shouldn't have changed
|
||
# While we are here we also test that SQL_LOG_BIN can't be set
|
||
--error 1227
|
||
SET @@session.sql_select_limit=10, @@session.sql_log_bin=0;
|
||
SELECT @@session.sql_select_limit = @save_select_limit; #shouldn't have changed
|
||
# Now as root, to be sure it works
|
||
connection con2;
|
||
SET @@session.pseudo_thread_id=100;
|
||
SET @@session.pseudo_thread_id=connection_id();
|
||
SET @@session.sql_log_bin=0;
|
||
SET @@session.sql_log_bin=1;
|
||
|
||
connection con3;
|
||
let $VERSION=`select version()`;
|
||
|
||
--disable_warnings
|
||
drop table if exists t1,t2;
|
||
--enable_warnings
|
||
|
||
create table t1(f int);
|
||
create table t2(f int);
|
||
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
|
||
|
||
connection con1;
|
||
create temporary table t3(f int);
|
||
insert into t3 select * from t1 where f<6;
|
||
sleep 1;
|
||
|
||
connection con2;
|
||
create temporary table t3(f int);
|
||
sleep 1;
|
||
|
||
connection con1;
|
||
insert into t2 select count(*) from t3;
|
||
sleep 1;
|
||
|
||
connection con2;
|
||
insert into t3 select * from t1 where f>=4;
|
||
sleep 1;
|
||
|
||
connection con1;
|
||
drop temporary table t3;
|
||
sleep 1;
|
||
|
||
connection con2;
|
||
insert into t2 select count(*) from t3;
|
||
drop temporary table t3;
|
||
|
||
select * from t2;
|
||
|
||
--replace_result $VERSION VERSION
|
||
show binlog events;
|
||
|
||
drop table t1, t2;
|
||
|
||
use test;
|
||
SET TIMESTAMP=1040323920;
|
||
create table t1(f int);
|
||
SET TIMESTAMP=1040323931;
|
||
create table t2(f int);
|
||
SET TIMESTAMP=1040323938;
|
||
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
|
||
|
||
SET TIMESTAMP=1040323945;
|
||
SET @@session.pseudo_thread_id=1;
|
||
create temporary table t3(f int);
|
||
SET TIMESTAMP=1040323952;
|
||
SET @@session.pseudo_thread_id=1;
|
||
insert into t3 select * from t1 where f<6;
|
||
SET TIMESTAMP=1040324145;
|
||
SET @@session.pseudo_thread_id=2;
|
||
create temporary table t3(f int);
|
||
SET TIMESTAMP=1040324186;
|
||
SET @@session.pseudo_thread_id=1;
|
||
insert into t2 select count(*) from t3;
|
||
SET TIMESTAMP=1040324200;
|
||
SET @@session.pseudo_thread_id=2;
|
||
insert into t3 select * from t1 where f>=4;
|
||
SET TIMESTAMP=1040324211;
|
||
SET @@session.pseudo_thread_id=1;
|
||
drop temporary table t3;
|
||
SET TIMESTAMP=1040324219;
|
||
SET @@session.pseudo_thread_id=2;
|
||
insert into t2 select count(*) from t3;
|
||
SET TIMESTAMP=1040324224;
|
||
SET @@session.pseudo_thread_id=2;
|
||
drop temporary table t3;
|
||
|
||
select * from t2;
|
||
drop table t1,t2;
|
||
|
||
# Create last a temporary table that is not dropped at end to ensure that we
|
||
# don't get any memory leaks for this
|
||
|
||
create temporary table t3 (f int);
|
||
sync_with_master;
|
||
|
||
#
|
||
# BUG#17263 incorrect generation DROP temp tables
|
||
# Temporary tables of connection are dropped in batches
|
||
# where a batch correspond to pseudo_thread_id
|
||
# value was set up at the moment of temp table creation
|
||
#
|
||
connection con1;
|
||
set @session.pseudo_thread_id=100;
|
||
create temporary table t101 (id int);
|
||
create temporary table t102 (id int);
|
||
set @session.pseudo_thread_id=200;
|
||
create temporary table t201 (id int);
|
||
create temporary table `#not_user_table_prefixed_with_hash_sign_no_harm` (id int);
|
||
set @con1_id=connection_id();
|
||
kill @con1_id;
|
||
|
||
#now do something to show that slave is ok after DROP temp tables
|
||
connection master;
|
||
create table t1(f int);
|
||
insert into t1 values (1);
|
||
|
||
sync_slave_with_master;
|
||
#connection slave;
|
||
select * from t1 /* must be 1 */;
|
||
|
||
connection master;
|
||
drop table t1;
|
||
|
||
#
|
||
#14157: utf8 encoding in binlog without set character_set_client
|
||
#
|
||
--exec $MYSQL --default-character-set=koi8r test -e 'create table t1 (a int); set names koi8r; create temporary table `<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>` (a int); insert into `<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>` values (1); insert into t1 select * from `<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>`'
|
||
|
||
sync_slave_with_master;
|
||
#connection slave;
|
||
select * from t1;
|
||
|
||
connection master;
|
||
drop table t1;
|
||
|
||
# End of 4.1 tests
|