mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
Proper replication of CONNECTION_ID() and 4.1 PASSWORD() (bugs 177 and 344),
new test for this. sql/item_create.cc: Proper replication of CONNECTION_ID() (bug 177). This is just for replication; mysqlbinlog|mysql still does not work with CONNECTION_ID(), it will wait for row-level binlogging. sql/item_strfunc.cc: Proper replication of the new 4.1 PASSWORD() (bug 344)
This commit is contained in:
parent
9f22d16669
commit
40e4b8d0cb
5 changed files with 70 additions and 2 deletions
21
mysql-test/r/rpl_misc_functions.result
Normal file
21
mysql-test/r/rpl_misc_functions.result
Normal file
|
@ -0,0 +1,21 @@
|
|||
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 table t1(id int, i int, r1 int, r2 int, p varchar(100));
|
||||
insert into t1 values(1, connection_id(), 0, 0, "");
|
||||
insert into t1 values(2, 0, rand()*1000, rand()*1000, "");
|
||||
set sql_log_bin=0;
|
||||
insert into t1 values(6, 0, rand(), rand(), "");
|
||||
delete from t1 where id=6;
|
||||
set sql_log_bin=1;
|
||||
insert into t1 values(3, 0, 0, 0, password('does_this_work?'));
|
||||
insert into t1 values(4, connection_id(), rand()*1000, rand()*1000, password('does_this_still_work?'));
|
||||
select * into outfile 'rpl_misc_functions.outfile' from t1;
|
||||
create table t2 like t1;
|
||||
load data local infile './var/master-data/test/rpl_misc_functions.outfile' into table t2;
|
||||
select * from t1, t2 where (t1.id=t2.id) and not(t1.i=t2.i and t1.r1=t2.r1 and t1.r2=t2.r2 and t1.p=t2.p);
|
||||
id i r1 r2 p id i r1 r2 p
|
||||
stop slave;
|
1
mysql-test/t/rpl_misc_functions-slave.sh
Executable file
1
mysql-test/t/rpl_misc_functions-slave.sh
Executable file
|
@ -0,0 +1 @@
|
|||
rm -f $MYSQL_TEST_DIR/var/master-data/test/rpl_misc_functions.outfile
|
30
mysql-test/t/rpl_misc_functions.test
Normal file
30
mysql-test/t/rpl_misc_functions.test
Normal file
|
@ -0,0 +1,30 @@
|
|||
#
|
||||
# Test of replicating some difficult functions
|
||||
#
|
||||
source include/master-slave.inc;
|
||||
|
||||
create table t1(id int, i int, r1 int, r2 int, p varchar(100));
|
||||
insert into t1 values(1, connection_id(), 0, 0, "");
|
||||
# don't put rand and password in the same query, to see if they replicate
|
||||
# independently
|
||||
# Pure rand test
|
||||
insert into t1 values(2, 0, rand()*1000, rand()*1000, "");
|
||||
# change the rand suite on the master (we do this because otherwise password()
|
||||
# benefits from the fact that the above rand() is well replicated :
|
||||
# it picks the same sequence element, which hides a possible bug in password() replication.
|
||||
set sql_log_bin=0;
|
||||
insert into t1 values(6, 0, rand(), rand(), "");
|
||||
delete from t1 where id=6;
|
||||
set sql_log_bin=1;
|
||||
# Pure password test
|
||||
insert into t1 values(3, 0, 0, 0, password('does_this_work?'));
|
||||
# "altogether now"
|
||||
insert into t1 values(4, connection_id(), rand()*1000, rand()*1000, password('does_this_still_work?'));
|
||||
select * into outfile 'rpl_misc_functions.outfile' from t1;
|
||||
sync_slave_with_master;
|
||||
create table t2 like t1;
|
||||
# read the values from the master table
|
||||
load data local infile './var/master-data/test/rpl_misc_functions.outfile' into table t2;
|
||||
# compare them with the replica; the SELECT below should return no row
|
||||
select * from t1, t2 where (t1.id=t2.id) and not(t1.i=t2.i and t1.r1=t2.r1 and t1.r2=t2.r2 and t1.p=t2.p);
|
||||
stop slave;
|
|
@ -84,8 +84,12 @@ Item *create_func_connection_id(void)
|
|||
{
|
||||
THD *thd=current_thd;
|
||||
thd->lex.safe_to_cache_query=0;
|
||||
return new Item_int(NullS,(longlong) thd->thread_id,10);
|
||||
}
|
||||
return new Item_int(NullS,(longlong)
|
||||
((thd->slave_thread) ?
|
||||
thd->variables.pseudo_thread_id :
|
||||
thd->thread_id),
|
||||
10);
|
||||
}
|
||||
|
||||
Item *create_func_conv(Item* a, Item *b, Item *c)
|
||||
{
|
||||
|
|
|
@ -1288,6 +1288,18 @@ String *Item_func_trim::val_str(String *str)
|
|||
|
||||
void Item_func_password::fix_length_and_dec()
|
||||
{
|
||||
/*
|
||||
If PASSWORD() was called with only one argument, it depends on a random
|
||||
number so we need to save this random number into the binary log.
|
||||
If called with two arguments, it is repeatable.
|
||||
*/
|
||||
if (arg_count == 1)
|
||||
{
|
||||
THD *thd= current_thd;
|
||||
thd->rand_used= 1;
|
||||
thd->rand_saved_seed1= thd->rand.seed1;
|
||||
thd->rand_saved_seed2= thd->rand.seed2;
|
||||
}
|
||||
max_length= get_password_length(use_old_passwords);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue