From 77b84b12e69e05a891f57cac157506c37dd60d0a Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 4 Feb 2008 16:35:41 +0200 Subject: [PATCH 01/14] Bug #32790 crash in trigger.test with InnoDB for a table the reason for the failure were incorrect asserts. Removing asserts altogether as there is no the implication does not hold (as explained in the comments for the file). sql/sql_delete.cc: removing two asserts because they can not hold basing on the definition of `normal_tables'. The one does not specify in a non-transactional table, which must be in the list of tables to be deleted, is modified indeed. So, it's possible to have normal_tables == true and deleted == true both but that would be yet a transactional table got modified (and then thd->transaction.stmt.modified_non_trans_table remains false default). --- sql/sql_delete.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index a28a39a769d..52e3ab73de0 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -730,8 +730,6 @@ void multi_delete::send_error(uint errcode,const char *err) } thd->transaction.all.modified_non_trans_table= true; } - DBUG_ASSERT(!normal_tables || !deleted || - thd->transaction.stmt.modified_non_trans_table); DBUG_VOID_RETURN; } @@ -839,8 +837,6 @@ bool multi_delete::send_eof() { query_cache_invalidate3(thd, delete_tables, 1); } - DBUG_ASSERT(!normal_tables || !deleted || - thd->transaction.stmt.modified_non_trans_table); if ((local_error == 0) || thd->transaction.stmt.modified_non_trans_table) { if (mysql_bin_log.is_open()) From 6210278628b834bfd599d461b0f5b515d4f085ee Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 4 Feb 2008 16:37:41 +0200 Subject: [PATCH 02/14] Bug#33329 extraneous ROLLBACK in binlog on connection does not use trans tables There had been two issues. Rollback statement was recorded in binlog even though a multi-update had not modified any non-transactional table. The reason for this artifact was a false initial value of multi_update::transactional_tables. Yet another artifact that explained on the bug page is that `ha_autocommit_or_rollback' works differently depending on whether a transaction engine has been compiled in. Fixed: with setting multi_update::transactional_tables to zero at initialization time. Multi-update on non-trans table won't cause ROLLBACK in binlog with either compilation option. The 2nd mentioned artifact comprises a self-standing issue (to be reported separately). mysql-test/r/multi_update.result: results changed - there is no ROLLBACK in binlog anymore as it should be sql/sql_update.cc: A wrong assumption on that there were modified transactional table, which is nonsense at the very beginning of the query execution. --- mysql-test/r/multi_update.result | 4 ++-- sql/sql_update.cc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mysql-test/r/multi_update.result b/mysql-test/r/multi_update.result index 8a0eacd9eeb..7a12fc87bdc 100644 --- a/mysql-test/r/multi_update.result +++ b/mysql-test/r/multi_update.result @@ -545,7 +545,7 @@ a b 4 4 show master status /* there must be the UPDATE query event */; File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 328 +master-bin.000001 189 delete from t1; delete from t2; insert into t1 values (1,2),(3,4),(4,4); @@ -555,7 +555,7 @@ UPDATE t2,t1 SET t2.a=t2.b where t2.a=t1.a; ERROR 23000: Duplicate entry '4' for key 1 show master status /* there must be the UPDATE query event */; File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 343 +master-bin.000001 204 drop table t1, t2; drop table if exists t1, t2, t3; CREATE TABLE t1 (a int, PRIMARY KEY (a)); diff --git a/sql/sql_update.cc b/sql/sql_update.cc index 84349a40977..e5017058659 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -979,7 +979,7 @@ multi_update::multi_update(TABLE_LIST *table_list, tmp_tables(0), updated(0), found(0), fields(field_list), values(value_list), table_count(0), copy_field(0), handle_duplicates(handle_duplicates_arg), do_update(1), trans_safe(1), - transactional_tables(1), ignore(ignore_arg), error_handled(0) + transactional_tables(0), ignore(ignore_arg), error_handled(0) {} From e4e7f8c385439b8aa30d4821127cbc2b9ed5ded7 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 8 Feb 2008 21:03:10 +0200 Subject: [PATCH 03/14] bug#34427 slave misses rendezvous in rpl_variables There was no instruction in the test that enforces the slave successfully connect to the master. The way the test was been written allowed the slave to had been late for rendezvous so that about-connecting time queries to the master failed and are error-logged to had been seen in Warnings of pb. Fixed with adding a sychronization primitive to the test. No test case is possible, observe error logs on pb. Todo: revise need of rpl_report.pl's rules due to failing execution of queries from get_master_verion_and_clock(). Any test should try to use a synchornization primitive like the current fix makes and do not let the slave to miss successful connecting. mysql-test/t/rpl_variables.test: Completing the test's body with a synch macro to not let the slave to miss the successful connecting to the master. --- mysql-test/t/rpl_variables.test | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mysql-test/t/rpl_variables.test b/mysql-test/t/rpl_variables.test index d0801e524e4..4e2d07cad54 100644 --- a/mysql-test/t/rpl_variables.test +++ b/mysql-test/t/rpl_variables.test @@ -1,5 +1,7 @@ source include/master-slave.inc; +connection master; + # Init for rstore of variable values set @my_slave_net_timeout =@@global.slave_net_timeout; @@ -18,3 +20,8 @@ show variables like 'slave_skip_errors'; # Restore touched values set global slave_net_timeout =@my_slave_net_timeout; + +# bug#34427 slave misses rendezvous +# don't let the master be shut down until the slave has connected +sync_slave_with_master; + From 530591ff8ec92648cd1d75479efb023e22df822c Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 11 Feb 2008 16:28:33 +0400 Subject: [PATCH 04/14] Bug#27877 incorrect german order in utf8_general_ci Problem: incorrect sort order for "U+00DF SHARP S". Fix: changing sort order for U+00DF to be equal to 's', like the manual says. mysql-test/r/ctype_latin1_de.result: Adding test mysql-test/r/ctype_uca.result: Adding test mysql-test/r/ctype_ucs.result: Adding test mysql-test/r/ctype_utf8.result: Adding test mysql-test/t/ctype_latin1_de.test: Adding test mysql-test/t/ctype_uca.test: Adding test mysql-test/t/ctype_ucs.test: Adding test mysql-test/t/ctype_utf8.test: Adding test strings/ctype-utf8.c: Changing weight for "U+00DF SHARP S" mysql-test/include/ctype_german.inc: New BitKeeper file ``mysql-test/include/ctype_german.inc'' --- mysql-test/include/ctype_german.inc | 40 +++++++++++++++++++++++++++++ mysql-test/r/ctype_latin1_de.result | 35 +++++++++++++++++++++++++ mysql-test/r/ctype_uca.result | 35 +++++++++++++++++++++++++ mysql-test/r/ctype_ucs.result | 35 +++++++++++++++++++++++++ mysql-test/r/ctype_utf8.result | 35 +++++++++++++++++++++++++ mysql-test/t/ctype_latin1_de.test | 1 + mysql-test/t/ctype_uca.test | 1 + mysql-test/t/ctype_ucs.test | 1 + mysql-test/t/ctype_utf8.test | 1 + strings/ctype-utf8.c | 2 +- 10 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 mysql-test/include/ctype_german.inc diff --git a/mysql-test/include/ctype_german.inc b/mysql-test/include/ctype_german.inc new file mode 100644 index 00000000000..14d09358bea --- /dev/null +++ b/mysql-test/include/ctype_german.inc @@ -0,0 +1,40 @@ +# +# Bug #27877 incorrect german order in utf8_general_ci +# +# Testing if "SHARP S" is equal to "S", +# like in latin1_german1_ci, utf8_general_ci, ucs2_general_ci +# Or if "SHART S" is equal to "SS", +# like in latin1_german2_ci, utf8_unicode_ci, ucs2_unicode_ci +# +# Also testing A-uml, O-uml, U-uml +# + +--disable_warnings +drop table if exists t1; +--enable_warnings + +# +# Create a table with a varchar(x) column, +# using current values of +# @@character_set_connection and @@collation_connection. +# + +create table t1 as select repeat(' ', 64) as s1; +select collation(s1) from t1; +delete from t1; + +# +# Populate data +# + +insert into t1 values ('a'),('ae'),(_latin1 0xE4); +insert into t1 values ('o'),('oe'),(_latin1 0xF6); +insert into t1 values ('s'),('ss'),(_latin1 0xDF); +insert into t1 values ('u'),('ue'),(_latin1 0xFC); + +# +# Check order +# +select s1, hex(s1) from t1 order by s1, binary s1; +select group_concat(s1 order by binary s1) from t1 group by s1; +drop table t1; diff --git a/mysql-test/r/ctype_latin1_de.result b/mysql-test/r/ctype_latin1_de.result index 5733877237d..f826199bb1f 100644 --- a/mysql-test/r/ctype_latin1_de.result +++ b/mysql-test/r/ctype_latin1_de.result @@ -326,6 +326,41 @@ latin1_german2_ci 6109 latin1_german2_ci 61 latin1_german2_ci 6120 drop table t1; +drop table if exists t1; +create table t1 as select repeat(' ', 64) as s1; +select collation(s1) from t1; +collation(s1) +latin1_german2_ci +delete from t1; +insert into t1 values ('a'),('ae'),(_latin1 0xE4); +insert into t1 values ('o'),('oe'),(_latin1 0xF6); +insert into t1 values ('s'),('ss'),(_latin1 0xDF); +insert into t1 values ('u'),('ue'),(_latin1 0xFC); +select s1, hex(s1) from t1 order by s1, binary s1; +s1 hex(s1) +a 61 +ae 6165 +ä E4 +o 6F +oe 6F65 +ö F6 +s 73 +ss 7373 +ß DF +u 75 +ue 7565 +ü FC +select group_concat(s1 order by binary s1) from t1 group by s1; +group_concat(s1 order by binary s1) +a +ae,ä +o +oe,ö +s +ss,ß +u +ue,ü +drop table t1; SET NAMES latin1; CREATE TABLE t1 ( col1 varchar(255) NOT NULL default '' diff --git a/mysql-test/r/ctype_uca.result b/mysql-test/r/ctype_uca.result index 92b76802d0b..999c20ce9e8 100644 --- a/mysql-test/r/ctype_uca.result +++ b/mysql-test/r/ctype_uca.result @@ -2647,6 +2647,41 @@ select c1 as c2h from t1 where c1 like 'ab#_def' escape '#'; c2h ab_def drop table t1; +drop table if exists t1; +create table t1 as select repeat(' ', 64) as s1; +select collation(s1) from t1; +collation(s1) +utf8_unicode_ci +delete from t1; +insert into t1 values ('a'),('ae'),(_latin1 0xE4); +insert into t1 values ('o'),('oe'),(_latin1 0xF6); +insert into t1 values ('s'),('ss'),(_latin1 0xDF); +insert into t1 values ('u'),('ue'),(_latin1 0xFC); +select s1, hex(s1) from t1 order by s1, binary s1; +s1 hex(s1) +a 61 +ä C3A4 +ae 6165 +o 6F +ö C3B6 +oe 6F65 +s 73 +ss 7373 +ß C39F +u 75 +ü C3BC +ue 7565 +select group_concat(s1 order by binary s1) from t1 group by s1; +group_concat(s1 order by binary s1) +a,ä +ae +o,ö +oe +s +ss,ß +u,ü +ue +drop table t1; CREATE TABLE t1 (id int, a varchar(30) character set utf8); INSERT INTO t1 VALUES (1, _ucs2 0x01310069), (2, _ucs2 0x01310131); INSERT INTO t1 VALUES (3, _ucs2 0x00690069), (4, _ucs2 0x01300049); diff --git a/mysql-test/r/ctype_ucs.result b/mysql-test/r/ctype_ucs.result index bd76f2a859f..8ec32d5bace 100644 --- a/mysql-test/r/ctype_ucs.result +++ b/mysql-test/r/ctype_ucs.result @@ -613,6 +613,41 @@ select c1 as c2h from t1 where c1 like 'ab#_def' escape '#'; c2h ab_def drop table t1; +drop table if exists t1; +create table t1 as select repeat(' ', 64) as s1; +select collation(s1) from t1; +collation(s1) +ucs2_general_ci +delete from t1; +insert into t1 values ('a'),('ae'),(_latin1 0xE4); +insert into t1 values ('o'),('oe'),(_latin1 0xF6); +insert into t1 values ('s'),('ss'),(_latin1 0xDF); +insert into t1 values ('u'),('ue'),(_latin1 0xFC); +select s1, hex(s1) from t1 order by s1, binary s1; +s1 hex(s1) +a 0061 +ä 00E4 +ae 00610065 +o 006F +ö 00F6 +oe 006F0065 +s 0073 +ß 00DF +ss 00730073 +u 0075 +ü 00FC +ue 00750065 +select group_concat(s1 order by binary s1) from t1 group by s1; +group_concat(s1 order by binary s1) +a,ä +ae +o,ö +oe +s,ß +ss +u,ü +ue +drop table t1; SET NAMES latin1; SET collation_connection='ucs2_bin'; create table t1 select repeat('a',4000) a; diff --git a/mysql-test/r/ctype_utf8.result b/mysql-test/r/ctype_utf8.result index 5c90c3b5e0b..12e6c9bb492 100644 --- a/mysql-test/r/ctype_utf8.result +++ b/mysql-test/r/ctype_utf8.result @@ -939,6 +939,41 @@ select c1 as c2h from t1 where c1 like 'ab#_def' escape '#'; c2h ab_def drop table t1; +drop table if exists t1; +create table t1 as select repeat(' ', 64) as s1; +select collation(s1) from t1; +collation(s1) +utf8_general_ci +delete from t1; +insert into t1 values ('a'),('ae'),(_latin1 0xE4); +insert into t1 values ('o'),('oe'),(_latin1 0xF6); +insert into t1 values ('s'),('ss'),(_latin1 0xDF); +insert into t1 values ('u'),('ue'),(_latin1 0xFC); +select s1, hex(s1) from t1 order by s1, binary s1; +s1 hex(s1) +a 61 +ä C3A4 +ae 6165 +o 6F +ö C3B6 +oe 6F65 +s 73 +ß C39F +ss 7373 +u 75 +ü C3BC +ue 7565 +select group_concat(s1 order by binary s1) from t1 group by s1; +group_concat(s1 order by binary s1) +a,ä +ae +o,ö +oe +s,ß +ss +u,ü +ue +drop table t1; SET collation_connection='utf8_bin'; create table t1 select repeat('a',4000) a; delete from t1; diff --git a/mysql-test/t/ctype_latin1_de.test b/mysql-test/t/ctype_latin1_de.test index d6a11a22857..1efbfa4a3ae 100644 --- a/mysql-test/t/ctype_latin1_de.test +++ b/mysql-test/t/ctype_latin1_de.test @@ -116,6 +116,7 @@ SELECT FIELD('ue',s1), FIELD(' DROP TABLE t1; -- source include/ctype_filesort.inc +-- source include/ctype_german.inc # # Bug#7878 with utf8_general_ci, equals (=) has problem with diff --git a/mysql-test/t/ctype_uca.test b/mysql-test/t/ctype_uca.test index 0d917428efb..5749c7e4861 100644 --- a/mysql-test/t/ctype_uca.test +++ b/mysql-test/t/ctype_uca.test @@ -458,6 +458,7 @@ drop table t1; SET collation_connection='utf8_unicode_ci'; -- source include/ctype_filesort.inc -- source include/ctype_like_escape.inc +-- source include/ctype_german.inc # End of 4.1 tests diff --git a/mysql-test/t/ctype_ucs.test b/mysql-test/t/ctype_ucs.test index 3af5bfa54f9..08b3cb45395 100644 --- a/mysql-test/t/ctype_ucs.test +++ b/mysql-test/t/ctype_ucs.test @@ -373,6 +373,7 @@ drop table t1; SET collation_connection='ucs2_general_ci'; -- source include/ctype_filesort.inc -- source include/ctype_like_escape.inc +-- source include/ctype_german.inc SET NAMES latin1; SET collation_connection='ucs2_bin'; -- source include/ctype_filesort.inc diff --git a/mysql-test/t/ctype_utf8.test b/mysql-test/t/ctype_utf8.test index d18a7d22a0e..2e23ac3661c 100644 --- a/mysql-test/t/ctype_utf8.test +++ b/mysql-test/t/ctype_utf8.test @@ -721,6 +721,7 @@ select hex(soundex(_utf8 0xD091D092D093)); SET collation_connection='utf8_general_ci'; -- source include/ctype_filesort.inc -- source include/ctype_like_escape.inc +-- source include/ctype_german.inc SET collation_connection='utf8_bin'; -- source include/ctype_filesort.inc -- source include/ctype_like_escape.inc diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 2b248f1eed5..2afb1930f3d 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -155,7 +155,7 @@ static MY_UNICASE_INFO plane00[]={ {0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055}, {0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055}, {0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059}, - {0x00DE,0x00FE,0x00DE}, {0x00DF,0x00DF,0x00DF}, + {0x00DE,0x00FE,0x00DE}, {0x00DF,0x00DF,0x0053}, {0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041}, {0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041}, {0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041}, From 2942c1ea4d7bb89917da8ab4a301ad2cbb1f6f9a Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 11 Feb 2008 15:14:24 +0100 Subject: [PATCH 05/14] Problem: pushbuild has sporadic errors during startup of rpl_ndb_rep_ignore Reason: previous test, rpl_ndb_2multi_eng, does not sync slave with master after cleanup, so tables are sometimes left on slave Fix: sync_slave_with_master mysql-test/extra/rpl_tests/rpl_ndb_2multi_eng.test: Wait until drop table is replicated to slave before terminating. (The extra table caused sporadic errors in the next test case, causing pushbuild to fail.) --- mysql-test/extra/rpl_tests/rpl_ndb_2multi_eng.test | 1 + 1 file changed, 1 insertion(+) diff --git a/mysql-test/extra/rpl_tests/rpl_ndb_2multi_eng.test b/mysql-test/extra/rpl_tests/rpl_ndb_2multi_eng.test index 7f19245c0b9..1677aaf8277 100644 --- a/mysql-test/extra/rpl_tests/rpl_ndb_2multi_eng.test +++ b/mysql-test/extra/rpl_tests/rpl_ndb_2multi_eng.test @@ -342,5 +342,6 @@ SHOW CREATE TABLE t1; --echo --- Do Cleanup --- DROP TABLE IF EXISTS t1; +sync_slave_with_master; # End of 5.1 test case From 914ae26cf926332a91f838bc274db82f62981445 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 12 Feb 2008 17:22:04 +0100 Subject: [PATCH 06/14] Moved mysql-test/suite/rpl/rpl_variables.test into mysql-test/t/variables.test, because: - mysql-test/suite/rpl/t/rpl_variables.test does not replicate anything, so should not be in the rpl suite. - mysql-test/t/variables.test is the place for testing variable-related problems and features. - I will soon commit a patch containing a test case that tests replication of variables. It would be good if I could call the test case mysql-test/suite/rpl/t/rpl_variables.test. I'm making place for that now. mysql-test/t/variables-master.opt: Rename: mysql-test/suite/rpl/t/rpl_variables-master.opt -> mysql-test/t/variables-master.opt BitKeeper/deleted/.del-rpl_variables.test: Delete: mysql-test/suite/rpl/t/rpl_variables.test BitKeeper/deleted/.del-rpl_variables.result: Delete: mysql-test/suite/rpl/r/rpl_variables.result mysql-test/r/variables.result: Moved mysql-test/suite/rpl/t/rpl_variables.test into mysql-test/t/variables.test . Result file needs to be updated. mysql-test/t/variables.test: Moved mysql-test/suite/rpl/t/rpl_variables.test into mysql-test/t/variables.test . --- mysql-test/r/variables.result | 14 +++++++++++++ mysql-test/suite/rpl/r/rpl_variables.result | 19 ------------------ mysql-test/suite/rpl/t/rpl_variables.test | 20 ------------------- .../variables-master.opt} | 0 mysql-test/t/variables.test | 19 ++++++++++++++++++ 5 files changed, 33 insertions(+), 39 deletions(-) delete mode 100644 mysql-test/suite/rpl/r/rpl_variables.result delete mode 100644 mysql-test/suite/rpl/t/rpl_variables.test rename mysql-test/{suite/rpl/t/rpl_variables-master.opt => t/variables-master.opt} (100%) diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result index e5c3c860c93..395ba0eab48 100644 --- a/mysql-test/r/variables.result +++ b/mysql-test/r/variables.result @@ -22,6 +22,7 @@ set @my_query_cache_limit =@@global.query_cache_limit; set @my_query_cache_type =@@global.query_cache_type; set @my_rpl_recovery_rank =@@global.rpl_recovery_rank; set @my_server_id =@@global.server_id; +set @my_slave_net_timeout =@@global.slave_net_timeout; set @my_slow_launch_time =@@global.slow_launch_time; set @my_storage_engine =@@global.storage_engine; set @my_thread_cache_size =@@global.thread_cache_size; @@ -981,6 +982,17 @@ show variables like 'hostname'; Variable_name Value hostname # End of 5.0 tests +set global slave_net_timeout=100; +set global sql_slave_skip_counter=100; +show variables like 'slave_compressed_protocol'; +Variable_name Value +slave_compressed_protocol OFF +show variables like 'slave_load_tmpdir'; +Variable_name Value +slave_load_tmpdir SLAVE_LOAD_TMPDIR +show variables like 'slave_skip_errors'; +Variable_name Value +slave_skip_errors 3,100,137,643,1752 set global binlog_cache_size =@my_binlog_cache_size; set global connect_timeout =@my_connect_timeout; set global delayed_insert_timeout =@my_delayed_insert_timeout; @@ -1006,7 +1018,9 @@ set global query_cache_limit =@my_query_cache_limit; set global query_cache_type =@my_query_cache_type; set global rpl_recovery_rank =@my_rpl_recovery_rank; set global server_id =@my_server_id; +set global slave_net_timeout =@my_slave_net_timeout; set global slow_launch_time =@my_slow_launch_time; +set global sql_slave_skip_counter =0; set global storage_engine =@my_storage_engine; set global thread_cache_size =@my_thread_cache_size; show global variables where Variable_name='table_definition_cache' or diff --git a/mysql-test/suite/rpl/r/rpl_variables.result b/mysql-test/suite/rpl/r/rpl_variables.result deleted file mode 100644 index 605a48859a0..00000000000 --- a/mysql-test/suite/rpl/r/rpl_variables.result +++ /dev/null @@ -1,19 +0,0 @@ -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; -set @my_slave_net_timeout =@@global.slave_net_timeout; -set global slave_net_timeout=100; -set global sql_slave_skip_counter=100; -show variables like 'slave_compressed_protocol'; -Variable_name Value -slave_compressed_protocol OFF -show variables like 'slave_load_tmpdir'; -Variable_name Value -slave_load_tmpdir SLAVE_LOAD_TMPDIR -show variables like 'slave_skip_errors'; -Variable_name Value -slave_skip_errors 3,100,137,643,1752 -set global slave_net_timeout=default; diff --git a/mysql-test/suite/rpl/t/rpl_variables.test b/mysql-test/suite/rpl/t/rpl_variables.test deleted file mode 100644 index 84dc3acfe6e..00000000000 --- a/mysql-test/suite/rpl/t/rpl_variables.test +++ /dev/null @@ -1,20 +0,0 @@ -source include/master-slave.inc; - -# Init for rstore of variable values -set @my_slave_net_timeout =@@global.slave_net_timeout; - -set global slave_net_timeout=100; -set global sql_slave_skip_counter=100; - -# End of 4.1 tests - -# BUG #7800: Add various-slave related variables to SHOW VARIABLES -show variables like 'slave_compressed_protocol'; ---replace_column 2 SLAVE_LOAD_TMPDIR -show variables like 'slave_load_tmpdir'; -# We just set some arbitrary values in variables-master.opt so we can test -# that a list of values works correctly -show variables like 'slave_skip_errors'; - -# Cleanup -set global slave_net_timeout=default; diff --git a/mysql-test/suite/rpl/t/rpl_variables-master.opt b/mysql-test/t/variables-master.opt similarity index 100% rename from mysql-test/suite/rpl/t/rpl_variables-master.opt rename to mysql-test/t/variables-master.opt diff --git a/mysql-test/t/variables.test b/mysql-test/t/variables.test index 51f8d6db1db..404a98d1827 100644 --- a/mysql-test/t/variables.test +++ b/mysql-test/t/variables.test @@ -31,6 +31,7 @@ set @my_query_cache_limit =@@global.query_cache_limit; set @my_query_cache_type =@@global.query_cache_type; set @my_rpl_recovery_rank =@@global.rpl_recovery_rank; set @my_server_id =@@global.server_id; +set @my_slave_net_timeout =@@global.slave_net_timeout; set @my_slow_launch_time =@@global.slow_launch_time; set @my_storage_engine =@@global.storage_engine; set @my_thread_cache_size =@@global.thread_cache_size; @@ -737,6 +738,20 @@ show variables like 'hostname'; --echo End of 5.0 tests +# +# BUG #7800: SHOW VARIABLES does not show slave-related configuration +# +set global slave_net_timeout=100; +set global sql_slave_skip_counter=100; + +show variables like 'slave_compressed_protocol'; +--replace_column 2 SLAVE_LOAD_TMPDIR +show variables like 'slave_load_tmpdir'; +# We just set some arbitrary values in variables-master.opt so we can test +# that a list of values is printed correctly. +show variables like 'slave_skip_errors'; + +# # This is at the very after the versioned tests, since it involves doing # cleanup # @@ -768,7 +783,11 @@ set global query_cache_limit =@my_query_cache_limit; set global query_cache_type =@my_query_cache_type; set global rpl_recovery_rank =@my_rpl_recovery_rank; set global server_id =@my_server_id; +set global slave_net_timeout =@my_slave_net_timeout; set global slow_launch_time =@my_slow_launch_time; +# sql_slave_skip_counter is write-only, so we can't save previous +# value and restore it here. That's ok, because it's normally 0. +set global sql_slave_skip_counter =0; set global storage_engine =@my_storage_engine; set global thread_cache_size =@my_thread_cache_size; From ded528ca1249f35f55f9d7b52d95c96e94734495 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 13 Feb 2008 14:09:41 +0200 Subject: [PATCH 07/14] Bug #33931 assertion at write_ignored_events_info_to_relay_log if init_slave_thread() fails and bug#33932 assertion at handle_slave_sql if init_slave_thread() fails the asserts were caused by bug33931: having thd deleted at time of executing err: code plus a missed initialization; bug33932: initialization of slave_is_running member was missed; fixed with relocating mi members initialization and removing delete thd It is safe to do as deletion happens later explicitly in the caller of init_slave_thread(). Todo: at merging the test is better to be moved into suite/bugs for 5.x (when x>0). sql/slave.cc: adding the bugs simulating code; relocating some assignments to satisfy the asserts; mysql-test/r/rpl_bug33931.result: the new result file mysql-test/t/rpl_bug33931-slave.opt: option to spark the simulation code mysql-test/t/rpl_bug33931.test: tests check that slave does not crash as before. Slave threads must be in NO running state in the end. --- mysql-test/r/rpl_bug33931.result | 38 +++++++++++++++++++++++++++++ mysql-test/t/rpl_bug33931-slave.opt | 1 + mysql-test/t/rpl_bug33931.test | 37 ++++++++++++++++++++++++++++ sql/slave.cc | 18 +++++++++++--- 4 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 mysql-test/r/rpl_bug33931.result create mode 100644 mysql-test/t/rpl_bug33931-slave.opt create mode 100644 mysql-test/t/rpl_bug33931.test diff --git a/mysql-test/r/rpl_bug33931.result b/mysql-test/r/rpl_bug33931.result new file mode 100644 index 00000000000..519bd73aa6a --- /dev/null +++ b/mysql-test/r/rpl_bug33931.result @@ -0,0 +1,38 @@ +reset master; +stop slave; +reset slave; +start slave; +show slave status; +Slave_IO_State # +Master_Host 127.0.0.1 +Master_User root +Master_Port MASTER_PORT +Connect_Retry 1 +Master_Log_File +Read_Master_Log_Pos 4 +Relay_Log_File # +Relay_Log_Pos # +Relay_Master_Log_File +Slave_IO_Running No +Slave_SQL_Running No +Replicate_Do_DB +Replicate_Ignore_DB +Replicate_Do_Table +Replicate_Ignore_Table +Replicate_Wild_Do_Table +Replicate_Wild_Ignore_Table +Last_Errno 0 +Last_Error +Skip_Counter 0 +Exec_Master_Log_Pos 0 +Relay_Log_Space # +Until_Condition None +Until_Log_File +Until_Log_Pos 0 +Master_SSL_Allowed No +Master_SSL_CA_File +Master_SSL_CA_Path +Master_SSL_Cert +Master_SSL_Cipher +Master_SSL_Key +Seconds_Behind_Master # diff --git a/mysql-test/t/rpl_bug33931-slave.opt b/mysql-test/t/rpl_bug33931-slave.opt new file mode 100644 index 00000000000..55fe328a41d --- /dev/null +++ b/mysql-test/t/rpl_bug33931-slave.opt @@ -0,0 +1 @@ +--loose-debug=d,simulate_io_slave_error_on_init,simulate_sql_slave_error_on_init diff --git a/mysql-test/t/rpl_bug33931.test b/mysql-test/t/rpl_bug33931.test new file mode 100644 index 00000000000..788f79d4c1c --- /dev/null +++ b/mysql-test/t/rpl_bug33931.test @@ -0,0 +1,37 @@ +# Test for +# Bug #33931 assertion at write_ignored_events_info_to_relay_log if init_slave_thread() fails +# Bug #33932 assertion at handle_slave_sql if init_slave_thread() fails + +source include/have_debug.inc; +source include/have_log_bin.inc; + +connect (master,127.0.0.1,root,,test,$MASTER_MYPORT,); +connect (slave,127.0.0.1,root,,test,$SLAVE_MYPORT,); + + +connection master; +reset master; + +connection slave; +--disable_warnings +stop slave; +--enable_warnings +reset slave; +start slave; + +connection master; +save_master_pos; +connection slave; + +# +# slave is going to stop because of emulated failures +# but there won't be any crashes nor asserts hit. +# +source include/wait_for_slave_to_stop.inc; + +--replace_result $MASTER_MYPORT MASTER_PORT +--replace_column 1 # 8 # 9 # 23 # 33 # +query_vertical show slave status; + +# no clean-up is needed + diff --git a/sql/slave.cc b/sql/slave.cc index 4a65e9aaa85..272d6f117e9 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -2895,6 +2895,9 @@ void set_slave_thread_default_charset(THD* thd, RELAY_LOG_INFO *rli) static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type) { DBUG_ENTER("init_slave_thread"); +#if !defined(DBUG_OFF) + int simulate_error= 0; +#endif thd->system_thread = (thd_type == SLAVE_THD_SQL) ? SYSTEM_THREAD_SLAVE_SQL : SYSTEM_THREAD_SLAVE_IO; thd->security_ctx->skip_grants(); @@ -2914,10 +2917,17 @@ static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type) thd->thread_id = thread_id++; pthread_mutex_unlock(&LOCK_thread_count); + DBUG_EXECUTE_IF("simulate_io_slave_error_on_init", + simulate_error|= (1 << SLAVE_THD_IO);); + DBUG_EXECUTE_IF("simulate_sql_slave_error_on_init", + simulate_error|= (1 << SLAVE_THD_SQL);); +#if !defined(DBUG_OFF) + if (init_thr_lock() || thd->store_globals() || simulate_error & (1<< thd_type)) +#else if (init_thr_lock() || thd->store_globals()) +#endif { thd->cleanup(); - delete thd; DBUG_RETURN(-1); } @@ -3515,6 +3525,7 @@ slave_begin: thd= new THD; // note that contructor of THD uses DBUG_ ! THD_CHECK_SENTRY(thd); + mi->io_thd = thd; pthread_detach_this_thread(); thd->thread_stack= (char*) &thd; // remember where our stack is @@ -3525,7 +3536,6 @@ slave_begin: sql_print_error("Failed during slave I/O thread initialization"); goto err; } - mi->io_thd = thd; pthread_mutex_lock(&LOCK_thread_count); threads.append(thd); pthread_mutex_unlock(&LOCK_thread_count); @@ -3865,9 +3875,11 @@ slave_begin: thd = new THD; // note that contructor of THD uses DBUG_ ! thd->thread_stack = (char*)&thd; // remember where our stack is + rli->sql_thd= thd; /* Inform waiting threads that slave has started */ rli->slave_run_id++; + rli->slave_running = 1; pthread_detach_this_thread(); if (init_slave_thread(thd, SLAVE_THD_SQL)) @@ -3882,7 +3894,6 @@ slave_begin: goto err; } thd->init_for_queries(); - rli->sql_thd= thd; thd->temporary_tables = rli->save_temporary_tables; // restore temp tables pthread_mutex_lock(&LOCK_thread_count); threads.append(thd); @@ -3895,7 +3906,6 @@ slave_begin: start receiving data so we realize we are not caught up and Seconds_Behind_Master grows. No big deal. */ - rli->slave_running = 1; rli->abort_slave = 0; pthread_mutex_unlock(&rli->run_lock); pthread_cond_broadcast(&rli->start_cond); From 68114c88fbf87055c861796bef476fe879e58f0e Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 13 Feb 2008 17:39:23 +0100 Subject: [PATCH 08/14] BUG#32991: Races in mysqldump.test (or mysqldump.test fails sporadically) This is *not* a fix to the bug. I'm only disabling the failing part of mysqldump.test until the bug is fixed. Whoever fixes it, please re-enable the test. mysql-test/r/mysqldump.result: Disabling part of the test case until BUG#32991 is fixed. Result file updated accordingly. mysql-test/t/mysqldump.test: Disabling this part of the test case until BUG#32991 is fixed. --- mysql-test/r/mysqldump.result | 175 ---------------------------------- mysql-test/t/mysqldump.test | 6 ++ 2 files changed, 6 insertions(+), 175 deletions(-) diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result index d07aed5317a..a73ec61dad3 100644 --- a/mysql-test/r/mysqldump.result +++ b/mysql-test/r/mysqldump.result @@ -3870,181 +3870,6 @@ UNLOCK TABLES; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; DROP TABLE t1; -create table t1 (a text , b text); -create table t2 (a text , b text); -insert t1 values ("Duck, Duck", "goose"); -insert t1 values ("Duck, Duck", "pidgeon"); -insert t2 values ("We the people", "in order to perform"); -insert t2 values ("a more perfect", "union"); -select * from t1; -a b -Duck, Duck goose -Duck, Duck pidgeon -select * from t2; -a b -We the people in order to perform -a more perfect union -test.t1: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0 -test.t2: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0 -select * from t1; -a b -Duck, Duck goose -Duck, Duck pidgeon -Duck, Duck goose -Duck, Duck pidgeon -select * from t2; -a b -We the people in order to perform -a more perfect union -We the people in order to perform -a more perfect union -create table words(a varchar(255)); -create table words2(b varchar(255)); -select * from t1; -a b -Duck, Duck goose -Duck, Duck pidgeon -Duck, Duck goose -Duck, Duck pidgeon -Duck, Duck goose -Duck, Duck pidgeon -select * from t2; -a b -We the people in order to perform -a more perfect union -We the people in order to perform -a more perfect union -We the people in order to perform -a more perfect union -select * from words; -a -Aarhus -Aaron -Ababa -aback -abaft -abandon -abandoned -abandoning -abandonment -abandons -Aarhus -Aaron -Ababa -aback -abaft -abandon -abandoned -abandoning -abandonment -abandons -abase -abased -abasement -abasements -abases -abash -abashed -abashes -abashing -abasing -abate -abated -abatement -abatements -abater -abates -abating -Abba -abbe -abbey -abbeys -abbot -abbots -Abbott -abbreviate -abbreviated -abbreviates -abbreviating -abbreviation -abbreviations -Abby -abdomen -abdomens -abdominal -abduct -abducted -abduction -abductions -abductor -abductors -abducts -Abe -abed -Abel -Abelian -Abelson -Aberdeen -Abernathy -aberrant -aberration -select * from words2; -b -abase -abased -abasement -abasements -abases -abash -abashed -abashes -abashing -abasing -abate -abated -abatement -abatements -abater -abates -abating -Abba -abbe -abbey -abbeys -abbot -abbots -Abbott -abbreviate -abbreviated -abbreviates -abbreviating -abbreviation -abbreviations -Abby -abdomen -abdomens -abdominal -abduct -abducted -abduction -abductions -abductor -abductors -abducts -Abe -abed -Abel -Abelian -Abelson -Aberdeen -Abernathy -aberrant -aberration -drop table words; -mysql-import: Error: 1146, Table 'test.words' doesn't exist, when using table: words -drop table t1; -drop table t2; -drop table words2; # # BUG# 16853: mysqldump doesn't show events # diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test index 0e4e9989ffa..87613232011 100644 --- a/mysql-test/t/mysqldump.test +++ b/mysql-test/t/mysqldump.test @@ -1613,6 +1613,10 @@ DROP TABLE t1; # # Added for use-thread option # + +# THIS PART OF THE TEST IS DISABLED UNTIL BUG#32991 IS FIXED +if ($bug32991_fixed) { + create table t1 (a text , b text); create table t2 (a text , b text); insert t1 values ("Duck, Duck", "goose"); @@ -1650,6 +1654,8 @@ drop table t2; drop table words2; +} + --echo # --echo # BUG# 16853: mysqldump doesn't show events --echo # From 50bd4a438e72fdf6f46e2d714b2f13999fa460b2 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 14 Feb 2008 16:28:32 +0200 Subject: [PATCH 09/14] bug#33329 extraneous ROLLBACK in binlog on connection does not use trans tables changes for an assert and an updated results file. mysql-test/r/mix_innodb_myisam_binlog.result: results file changed as there is no ROLLBACK query in binlog as it must be. sql/sql_update.cc: refining assert as the initial value of transactional_tables has been changed to zero. --- mysql-test/r/mix_innodb_myisam_binlog.result | 2 +- sql/sql_update.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/mix_innodb_myisam_binlog.result b/mysql-test/r/mix_innodb_myisam_binlog.result index e1968ac7ef8..b1d328a61dc 100644 --- a/mysql-test/r/mix_innodb_myisam_binlog.result +++ b/mysql-test/r/mix_innodb_myisam_binlog.result @@ -447,7 +447,7 @@ UPDATE t4,t3 SET t4.a=t3.a + bug27417(1) /* top level non-ta table */; ERROR 23000: Duplicate entry '2' for key 1 show master status /* the offset must denote there is the query */; File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 369 +master-bin.000001 230 select count(*) from t1 /* must be 4 */; count(*) 4 diff --git a/sql/sql_update.cc b/sql/sql_update.cc index e5017058659..9c82bde9497 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -1482,7 +1482,7 @@ void multi_update::send_error(uint errcode,const char *err) if (trans_safe) { - DBUG_ASSERT(transactional_tables); + DBUG_ASSERT(!updated || transactional_tables); (void) ha_autocommit_or_rollback(thd, 1); } else From 40176e196253b8b79156e6e8258f80fc7ea60903 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 15 Feb 2008 12:56:44 +0100 Subject: [PATCH 10/14] Bug #34458 Extreneous use of templates in server code Replacing a template function with a normal static function. The template parameter, which previously was the class to find a binlogging function in, is now passed as a pointer to the actual binlogging function instead. The patch requires change of indention, but that is submitted as a separate patch. sql/handler.cc: Replacing template function with a normal static function. --- sql/handler.cc | 62 +++++++++++++++++--------------------------------- 1 file changed, 21 insertions(+), 41 deletions(-) diff --git a/sql/handler.cc b/sql/handler.cc index 95d63740039..5b0a2693865 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -3843,11 +3843,7 @@ bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat) - table is not mysql.event */ -/* The Sun compiler cannot instantiate the template below if this is - declared static, but it works by putting it into an anonymous - namespace. */ -namespace { - bool check_table_binlog_row_based(THD *thd, TABLE *table) + static bool check_table_binlog_row_based(THD *thd, TABLE *table) { if (table->s->cached_row_logging_check == -1) { @@ -3864,7 +3860,6 @@ namespace { (thd->options & OPTION_BIN_LOG) && mysql_bin_log.is_open()); } -} /** @brief Write table maps for all (manually or automatically) locked tables @@ -3888,9 +3883,8 @@ namespace { THD::lock THD::locked_tables */ -namespace -{ - int write_locked_table_maps(THD *thd) + + static int write_locked_table_maps(THD *thd) { DBUG_ENTER("write_locked_table_maps"); DBUG_PRINT("enter", ("thd: 0x%lx thd->lock: 0x%lx thd->locked_tables: 0x%lx " @@ -3935,10 +3929,14 @@ namespace DBUG_RETURN(0); } - template int - binlog_log_row(TABLE* table, - const uchar *before_record, - const uchar *after_record) + +typedef bool Log_func(THD*, TABLE*, bool, MY_BITMAP*, + uint, const uchar*, const uchar*); + + static int binlog_log_row(TABLE* table, + const uchar *before_record, + const uchar *after_record, + Log_func *log_func) { if (table->no_replicate) return 0; @@ -3965,15 +3963,10 @@ namespace { bitmap_set_all(&cols); if (likely(!(error= write_locked_table_maps(thd)))) - { - error= - RowsEventT::binlog_row_logging_function(thd, table, - table->file-> - has_transactions(), - &cols, table->s->fields, - before_record, - after_record); - } + error= (*log_func)(thd, table, table->file->has_transactions(), + &cols, table->s->fields, + before_record, after_record); + if (!use_bitbuf) bitmap_free(&cols); } @@ -3981,22 +3974,6 @@ namespace return error ? HA_ERR_RBR_LOGGING_FAILED : 0; } - /* - Instantiate the versions we need for the above template function, - because we have -fno-implicit-template as compiling option. - */ - - template int - binlog_log_row(TABLE *, const uchar *, const uchar *); - - template int - binlog_log_row(TABLE *, const uchar *, const uchar *); - - template int - binlog_log_row(TABLE *, const uchar *, const uchar *); -} - - int handler::ha_external_lock(THD *thd, int lock_type) { DBUG_ENTER("handler::ha_external_lock"); @@ -4041,10 +4018,11 @@ int handler::ha_reset() int handler::ha_write_row(uchar *buf) { int error; + Log_func *log_func= Write_rows_log_event::binlog_row_logging_function; DBUG_ENTER("handler::ha_write_row"); if (unlikely(error= write_row(buf))) DBUG_RETURN(error); - if (unlikely(error= binlog_log_row(table, 0, buf))) + if (unlikely(error= binlog_log_row(table, 0, buf, log_func))) DBUG_RETURN(error); /* purecov: inspected */ DBUG_RETURN(0); } @@ -4053,6 +4031,7 @@ int handler::ha_write_row(uchar *buf) int handler::ha_update_row(const uchar *old_data, uchar *new_data) { int error; + Log_func *log_func= Update_rows_log_event::binlog_row_logging_function; /* Some storage engines require that the new record is in record[0] @@ -4062,7 +4041,7 @@ int handler::ha_update_row(const uchar *old_data, uchar *new_data) if (unlikely(error= update_row(old_data, new_data))) return error; - if (unlikely(error= binlog_log_row(table, old_data, new_data))) + if (unlikely(error= binlog_log_row(table, old_data, new_data, log_func))) return error; return 0; } @@ -4070,9 +4049,10 @@ int handler::ha_update_row(const uchar *old_data, uchar *new_data) int handler::ha_delete_row(const uchar *buf) { int error; + Log_func *log_func= Delete_rows_log_event::binlog_row_logging_function; if (unlikely(error= delete_row(buf))) return error; - if (unlikely(error= binlog_log_row(table, buf, 0))) + if (unlikely(error= binlog_log_row(table, buf, 0, log_func))) return error; return 0; } From 450ed5aea667515c2b7f076f2c1b0a2ca0e6e01e Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 15 Feb 2008 13:06:28 +0100 Subject: [PATCH 11/14] Bug #34458 Extreneous use of templates in server code Patch to remove white-space left over after removing anonymous namespace. sql/handler.cc: Removing indentation and whitespace. --- sql/handler.cc | 173 +++++++++++++++++++++++++------------------------ 1 file changed, 87 insertions(+), 86 deletions(-) diff --git a/sql/handler.cc b/sql/handler.cc index 5b0a2693865..a7a3d8ef53f 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -3843,24 +3843,25 @@ bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat) - table is not mysql.event */ - static bool check_table_binlog_row_based(THD *thd, TABLE *table) +static bool check_table_binlog_row_based(THD *thd, TABLE *table) +{ + if (table->s->cached_row_logging_check == -1) { - if (table->s->cached_row_logging_check == -1) - { - int const check(table->s->tmp_table == NO_TMP_TABLE && - binlog_filter->db_ok(table->s->db.str)); - table->s->cached_row_logging_check= check; - } - - DBUG_ASSERT(table->s->cached_row_logging_check == 0 || - table->s->cached_row_logging_check == 1); - - return (thd->current_stmt_binlog_row_based && - table->s->cached_row_logging_check && - (thd->options & OPTION_BIN_LOG) && - mysql_bin_log.is_open()); + int const check(table->s->tmp_table == NO_TMP_TABLE && + binlog_filter->db_ok(table->s->db.str)); + table->s->cached_row_logging_check= check; } + DBUG_ASSERT(table->s->cached_row_logging_check == 0 || + table->s->cached_row_logging_check == 1); + + return (thd->current_stmt_binlog_row_based && + table->s->cached_row_logging_check && + (thd->options & OPTION_BIN_LOG) && + mysql_bin_log.is_open()); +} + + /** @brief Write table maps for all (manually or automatically) locked tables to the binary log. @@ -3874,7 +3875,7 @@ bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat) that are locked by the thread 'thd'. Either manually locked (stored in THD::locked_tables) and automatically locked (stored in THD::lock) are considered. - + RETURN VALUE 0 All OK 1 Failed to write all table maps @@ -3884,95 +3885,95 @@ bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat) THD::locked_tables */ - static int write_locked_table_maps(THD *thd) +static int write_locked_table_maps(THD *thd) +{ + DBUG_ENTER("write_locked_table_maps"); + DBUG_PRINT("enter", ("thd: 0x%lx thd->lock: 0x%lx thd->locked_tables: 0x%lx " + "thd->extra_lock: 0x%lx", + (long) thd, (long) thd->lock, + (long) thd->locked_tables, (long) thd->extra_lock)); + + if (thd->get_binlog_table_maps() == 0) { - DBUG_ENTER("write_locked_table_maps"); - DBUG_PRINT("enter", ("thd: 0x%lx thd->lock: 0x%lx thd->locked_tables: 0x%lx " - "thd->extra_lock: 0x%lx", - (long) thd, (long) thd->lock, - (long) thd->locked_tables, (long) thd->extra_lock)); - - if (thd->get_binlog_table_maps() == 0) + MYSQL_LOCK *locks[3]; + locks[0]= thd->extra_lock; + locks[1]= thd->lock; + locks[2]= thd->locked_tables; + for (uint i= 0 ; i < sizeof(locks)/sizeof(*locks) ; ++i ) { - MYSQL_LOCK *locks[3]; - locks[0]= thd->extra_lock; - locks[1]= thd->lock; - locks[2]= thd->locked_tables; - for (uint i= 0 ; i < sizeof(locks)/sizeof(*locks) ; ++i ) - { - MYSQL_LOCK const *const lock= locks[i]; - if (lock == NULL) - continue; + MYSQL_LOCK const *const lock= locks[i]; + if (lock == NULL) + continue; - TABLE **const end_ptr= lock->table + lock->table_count; - for (TABLE **table_ptr= lock->table ; - table_ptr != end_ptr ; - ++table_ptr) + TABLE **const end_ptr= lock->table + lock->table_count; + for (TABLE **table_ptr= lock->table ; + table_ptr != end_ptr ; + ++table_ptr) + { + TABLE *const table= *table_ptr; + DBUG_PRINT("info", ("Checking table %s", table->s->table_name.str)); + if (table->current_lock == F_WRLCK && + check_table_binlog_row_based(thd, table)) { - TABLE *const table= *table_ptr; - DBUG_PRINT("info", ("Checking table %s", table->s->table_name.str)); - if (table->current_lock == F_WRLCK && - check_table_binlog_row_based(thd, table)) - { - int const has_trans= table->file->has_transactions(); - int const error= thd->binlog_write_table_map(table, has_trans); - /* - If an error occurs, it is the responsibility of the caller to - roll back the transaction. - */ - if (unlikely(error)) - DBUG_RETURN(1); - } + int const has_trans= table->file->has_transactions(); + int const error= thd->binlog_write_table_map(table, has_trans); + /* + If an error occurs, it is the responsibility of the caller to + roll back the transaction. + */ + if (unlikely(error)) + DBUG_RETURN(1); } } } - DBUG_RETURN(0); } + DBUG_RETURN(0); +} typedef bool Log_func(THD*, TABLE*, bool, MY_BITMAP*, uint, const uchar*, const uchar*); - static int binlog_log_row(TABLE* table, - const uchar *before_record, - const uchar *after_record, - Log_func *log_func) +static int binlog_log_row(TABLE* table, + const uchar *before_record, + const uchar *after_record, + Log_func *log_func) +{ + if (table->no_replicate) + return 0; + bool error= 0; + THD *const thd= table->in_use; + + if (check_table_binlog_row_based(thd, table)) { - if (table->no_replicate) - return 0; - bool error= 0; - THD *const thd= table->in_use; + MY_BITMAP cols; + /* Potential buffer on the stack for the bitmap */ + uint32 bitbuf[BITMAP_STACKBUF_SIZE/sizeof(uint32)]; + uint n_fields= table->s->fields; + my_bool use_bitbuf= n_fields <= sizeof(bitbuf)*8; - if (check_table_binlog_row_based(thd, table)) + /* + If there are no table maps written to the binary log, this is + the first row handled in this statement. In that case, we need + to write table maps for all locked tables to the binary log. + */ + if (likely(!(error= bitmap_init(&cols, + use_bitbuf ? bitbuf : NULL, + (n_fields + 7) & ~7UL, + FALSE)))) { - MY_BITMAP cols; - /* Potential buffer on the stack for the bitmap */ - uint32 bitbuf[BITMAP_STACKBUF_SIZE/sizeof(uint32)]; - uint n_fields= table->s->fields; - my_bool use_bitbuf= n_fields <= sizeof(bitbuf)*8; + bitmap_set_all(&cols); + if (likely(!(error= write_locked_table_maps(thd)))) + error= (*log_func)(thd, table, table->file->has_transactions(), + &cols, table->s->fields, + before_record, after_record); - /* - If there are no table maps written to the binary log, this is - the first row handled in this statement. In that case, we need - to write table maps for all locked tables to the binary log. - */ - if (likely(!(error= bitmap_init(&cols, - use_bitbuf ? bitbuf : NULL, - (n_fields + 7) & ~7UL, - FALSE)))) - { - bitmap_set_all(&cols); - if (likely(!(error= write_locked_table_maps(thd)))) - error= (*log_func)(thd, table, table->file->has_transactions(), - &cols, table->s->fields, - before_record, after_record); - - if (!use_bitbuf) - bitmap_free(&cols); - } + if (!use_bitbuf) + bitmap_free(&cols); } - return error ? HA_ERR_RBR_LOGGING_FAILED : 0; } + return error ? HA_ERR_RBR_LOGGING_FAILED : 0; +} int handler::ha_external_lock(THD *thd, int lock_type) { From 3f0a603c9619f8cc45b8261d65ca737507212da0 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 15 Feb 2008 12:54:04 +0000 Subject: [PATCH 12/14] Problem: After I moved rpl/t/rpl_variables.test into t/variables.test, t/variables.test fails on embedded server. Moved out that part again, to a new test called t/variables-notembedded.test. mysql-test/t/variables-notembedded.test: BitKeeper file /home/sven/bk/debug-max/5.1-new-rpl/mysql-test/t/variables-notembedded.test mysql-test/r/variables-notembedded.result: Add -master.opt file to have a list of variables for slave_skip_errors. mysql-test/r/variables.result: Variable variables not available in embedded mode to a new test, variables-notembedded.test mysql-test/t/variables-notembedded-master.opt: Add --loose before --slave-skip-errors, so that it works if mtr is run with --embedded mysql-test/t/variables.test: Variable variables not available in embedded mode to a new test, variables-notembedded.test. Result file updated accordingly. --- mysql-test/r/variables-notembedded.result | 17 +++++++++++ mysql-test/r/variables.result | 14 --------- mysql-test/t/variables-master.opt | 1 - mysql-test/t/variables-notembedded-master.opt | 1 + mysql-test/t/variables-notembedded.test | 30 +++++++++++++++++++ mysql-test/t/variables.test | 19 ------------ 6 files changed, 48 insertions(+), 34 deletions(-) create mode 100644 mysql-test/r/variables-notembedded.result delete mode 100644 mysql-test/t/variables-master.opt create mode 100644 mysql-test/t/variables-notembedded-master.opt create mode 100644 mysql-test/t/variables-notembedded.test diff --git a/mysql-test/r/variables-notembedded.result b/mysql-test/r/variables-notembedded.result new file mode 100644 index 00000000000..48a1719e2c7 --- /dev/null +++ b/mysql-test/r/variables-notembedded.result @@ -0,0 +1,17 @@ +---- Init ---- +set @my_slave_net_timeout =@@global.slave_net_timeout; +---- Test ---- +set global slave_net_timeout=100; +set global sql_slave_skip_counter=100; +show variables like 'slave_compressed_protocol'; +Variable_name Value +slave_compressed_protocol OFF +show variables like 'slave_load_tmpdir'; +Variable_name Value +slave_load_tmpdir SLAVE_LOAD_TMPDIR +show variables like 'slave_skip_errors'; +Variable_name Value +slave_skip_errors 3,100,137,643,1752 +---- Clean Up ---- +set global slave_net_timeout=default; +set global sql_slave_skip_counter= 0; diff --git a/mysql-test/r/variables.result b/mysql-test/r/variables.result index 395ba0eab48..e5c3c860c93 100644 --- a/mysql-test/r/variables.result +++ b/mysql-test/r/variables.result @@ -22,7 +22,6 @@ set @my_query_cache_limit =@@global.query_cache_limit; set @my_query_cache_type =@@global.query_cache_type; set @my_rpl_recovery_rank =@@global.rpl_recovery_rank; set @my_server_id =@@global.server_id; -set @my_slave_net_timeout =@@global.slave_net_timeout; set @my_slow_launch_time =@@global.slow_launch_time; set @my_storage_engine =@@global.storage_engine; set @my_thread_cache_size =@@global.thread_cache_size; @@ -982,17 +981,6 @@ show variables like 'hostname'; Variable_name Value hostname # End of 5.0 tests -set global slave_net_timeout=100; -set global sql_slave_skip_counter=100; -show variables like 'slave_compressed_protocol'; -Variable_name Value -slave_compressed_protocol OFF -show variables like 'slave_load_tmpdir'; -Variable_name Value -slave_load_tmpdir SLAVE_LOAD_TMPDIR -show variables like 'slave_skip_errors'; -Variable_name Value -slave_skip_errors 3,100,137,643,1752 set global binlog_cache_size =@my_binlog_cache_size; set global connect_timeout =@my_connect_timeout; set global delayed_insert_timeout =@my_delayed_insert_timeout; @@ -1018,9 +1006,7 @@ set global query_cache_limit =@my_query_cache_limit; set global query_cache_type =@my_query_cache_type; set global rpl_recovery_rank =@my_rpl_recovery_rank; set global server_id =@my_server_id; -set global slave_net_timeout =@my_slave_net_timeout; set global slow_launch_time =@my_slow_launch_time; -set global sql_slave_skip_counter =0; set global storage_engine =@my_storage_engine; set global thread_cache_size =@my_thread_cache_size; show global variables where Variable_name='table_definition_cache' or diff --git a/mysql-test/t/variables-master.opt b/mysql-test/t/variables-master.opt deleted file mode 100644 index a668c6bfbe8..00000000000 --- a/mysql-test/t/variables-master.opt +++ /dev/null @@ -1 +0,0 @@ ---slave-skip-errors=3,100,137,643,1752 diff --git a/mysql-test/t/variables-notembedded-master.opt b/mysql-test/t/variables-notembedded-master.opt new file mode 100644 index 00000000000..a684e591d10 --- /dev/null +++ b/mysql-test/t/variables-notembedded-master.opt @@ -0,0 +1 @@ +--loose-slave-skip-errors=3,100,137,643,1752 diff --git a/mysql-test/t/variables-notembedded.test b/mysql-test/t/variables-notembedded.test new file mode 100644 index 00000000000..79011a89b36 --- /dev/null +++ b/mysql-test/t/variables-notembedded.test @@ -0,0 +1,30 @@ +# Tests that variables work correctly (setting and showing). This +# test is like the main.variables test, but for variables not +# available in embedded mode. + +source include/not_embedded.inc; + +--echo ---- Init ---- +# Backup global variables so they can be restored at end of test. +set @my_slave_net_timeout =@@global.slave_net_timeout; + +--echo ---- Test ---- +set global slave_net_timeout=100; +set global sql_slave_skip_counter=100; + +# End of 4.1 tests + +# BUG #7800: Add various-slave related variables to SHOW VARIABLES +show variables like 'slave_compressed_protocol'; +--replace_column 2 SLAVE_LOAD_TMPDIR +show variables like 'slave_load_tmpdir'; +# We just set some arbitrary values in variables-master.opt so we can test +# that a list of values works correctly +show variables like 'slave_skip_errors'; + +--echo ---- Clean Up ---- + +set global slave_net_timeout=default; +# sql_slave_skip_counter is write-only, so we can't save previous +# value and restore it here. That's ok, because it's normally 0. +set global sql_slave_skip_counter= 0; diff --git a/mysql-test/t/variables.test b/mysql-test/t/variables.test index 404a98d1827..51f8d6db1db 100644 --- a/mysql-test/t/variables.test +++ b/mysql-test/t/variables.test @@ -31,7 +31,6 @@ set @my_query_cache_limit =@@global.query_cache_limit; set @my_query_cache_type =@@global.query_cache_type; set @my_rpl_recovery_rank =@@global.rpl_recovery_rank; set @my_server_id =@@global.server_id; -set @my_slave_net_timeout =@@global.slave_net_timeout; set @my_slow_launch_time =@@global.slow_launch_time; set @my_storage_engine =@@global.storage_engine; set @my_thread_cache_size =@@global.thread_cache_size; @@ -738,20 +737,6 @@ show variables like 'hostname'; --echo End of 5.0 tests -# -# BUG #7800: SHOW VARIABLES does not show slave-related configuration -# -set global slave_net_timeout=100; -set global sql_slave_skip_counter=100; - -show variables like 'slave_compressed_protocol'; ---replace_column 2 SLAVE_LOAD_TMPDIR -show variables like 'slave_load_tmpdir'; -# We just set some arbitrary values in variables-master.opt so we can test -# that a list of values is printed correctly. -show variables like 'slave_skip_errors'; - -# # This is at the very after the versioned tests, since it involves doing # cleanup # @@ -783,11 +768,7 @@ set global query_cache_limit =@my_query_cache_limit; set global query_cache_type =@my_query_cache_type; set global rpl_recovery_rank =@my_rpl_recovery_rank; set global server_id =@my_server_id; -set global slave_net_timeout =@my_slave_net_timeout; set global slow_launch_time =@my_slow_launch_time; -# sql_slave_skip_counter is write-only, so we can't save previous -# value and restore it here. That's ok, because it's normally 0. -set global sql_slave_skip_counter =0; set global storage_engine =@my_storage_engine; set global thread_cache_size =@my_thread_cache_size; From 6e11dd40b0b11eab8813c9247c247480923be831 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Feb 2008 15:16:39 +0100 Subject: [PATCH 13/14] Updating result files. mysql-test/r/multi_update.result: Result change. mysql-test/r/rpl_bug33931.result: Result change. mysql-test/suite/ndb/r/ndb_binlog_format.result: Result change. --- mysql-test/r/multi_update.result | 4 ++-- mysql-test/r/rpl_bug33931.result | 5 +++++ mysql-test/suite/ndb/r/ndb_binlog_format.result | 2 -- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/multi_update.result b/mysql-test/r/multi_update.result index d96927deed5..421a63cd54c 100644 --- a/mysql-test/r/multi_update.result +++ b/mysql-test/r/multi_update.result @@ -627,7 +627,7 @@ a b 4 4 show master status /* there must be the UPDATE query event */; File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 336 +master-bin.000001 197 delete from t1; delete from t2; insert into t1 values (1,2),(3,4),(4,4); @@ -637,7 +637,7 @@ UPDATE t2,t1 SET t2.a=t2.b where t2.a=t1.a; ERROR 23000: Duplicate entry '4' for key 'PRIMARY' show master status /* there must be the UPDATE query event */; File Position Binlog_Do_DB Binlog_Ignore_DB -master-bin.000001 351 +master-bin.000001 212 drop table t1, t2; set @@session.binlog_format= @sav_binlog_format; drop table if exists t1, t2, t3; diff --git a/mysql-test/r/rpl_bug33931.result b/mysql-test/r/rpl_bug33931.result index 519bd73aa6a..4043f04215b 100644 --- a/mysql-test/r/rpl_bug33931.result +++ b/mysql-test/r/rpl_bug33931.result @@ -36,3 +36,8 @@ Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master # +Master_SSL_Verify_Server_Cert No +Last_IO_Errno 0 +Last_IO_Error +Last_SQL_Errno 0 +Last_SQL_Error diff --git a/mysql-test/suite/ndb/r/ndb_binlog_format.result b/mysql-test/suite/ndb/r/ndb_binlog_format.result index b42a528a460..30c2ca872ed 100644 --- a/mysql-test/suite/ndb/r/ndb_binlog_format.result +++ b/mysql-test/suite/ndb/r/ndb_binlog_format.result @@ -18,9 +18,7 @@ master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (1,1), (1,2), (2 master-bin.000001 # Query # # use `test`; BEGIN master-bin.000001 # Query # # use `test`; INSERT INTO t2 VALUES (1,1), (1,2), (2,1), (2,2) master-bin.000001 # Query # # use `test`; COMMIT -master-bin.000001 # Query # # use `test`; BEGIN master-bin.000001 # Query # # use `test`; UPDATE t1, t2 SET m = 2, b = 3 WHERE n = c -master-bin.000001 # Query # # use `test`; COMMIT master-bin.000001 # Query # # use `test`; BEGIN master-bin.000001 # Query # # use `test`; INSERT INTO t3 VALUES (1,1), (1,2), (2,1), (2,2) master-bin.000001 # Query # # use `test`; UPDATE t1, t3 SET m = 2, e = 3 WHERE n = f From ace6d43164995d20116b95fa4329030ba3a4913e Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Feb 2008 15:48:17 +0100 Subject: [PATCH 14/14] Fixed broken result file. --- mysql-test/suite/bugs/r/rpl_bug31583.result | 1 + 1 file changed, 1 insertion(+) diff --git a/mysql-test/suite/bugs/r/rpl_bug31583.result b/mysql-test/suite/bugs/r/rpl_bug31583.result index a5e38e9b2d8..74846607313 100644 --- a/mysql-test/suite/bugs/r/rpl_bug31583.result +++ b/mysql-test/suite/bugs/r/rpl_bug31583.result @@ -13,3 +13,4 @@ a b SELECT * FROM t1 ORDER BY a; a b 3 -3 +DROP TABLE t1;