From 40e4b8d0cb1faf39acbfddc0e30f3e2d209bb4c2 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 13 May 2003 22:50:28 +0200 Subject: [PATCH] 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) --- mysql-test/r/rpl_misc_functions.result | 21 +++++++++++++++++ mysql-test/t/rpl_misc_functions-slave.sh | 1 + mysql-test/t/rpl_misc_functions.test | 30 ++++++++++++++++++++++++ sql/item_create.cc | 8 +++++-- sql/item_strfunc.cc | 12 ++++++++++ 5 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 mysql-test/r/rpl_misc_functions.result create mode 100755 mysql-test/t/rpl_misc_functions-slave.sh create mode 100644 mysql-test/t/rpl_misc_functions.test diff --git a/mysql-test/r/rpl_misc_functions.result b/mysql-test/r/rpl_misc_functions.result new file mode 100644 index 00000000000..a687063706d --- /dev/null +++ b/mysql-test/r/rpl_misc_functions.result @@ -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; diff --git a/mysql-test/t/rpl_misc_functions-slave.sh b/mysql-test/t/rpl_misc_functions-slave.sh new file mode 100755 index 00000000000..c293715e16f --- /dev/null +++ b/mysql-test/t/rpl_misc_functions-slave.sh @@ -0,0 +1 @@ +rm -f $MYSQL_TEST_DIR/var/master-data/test/rpl_misc_functions.outfile diff --git a/mysql-test/t/rpl_misc_functions.test b/mysql-test/t/rpl_misc_functions.test new file mode 100644 index 00000000000..12eadbb25ed --- /dev/null +++ b/mysql-test/t/rpl_misc_functions.test @@ -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; diff --git a/sql/item_create.cc b/sql/item_create.cc index 23e4ce1d2b4..1e547a9c76e 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -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) { diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 07ec66e9f9d..6118b25a88c 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -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); }