Commit 1aa2f9a1 authored by unknown's avatar unknown

Merge dl145h.mysql.com:/data0/mkindahl/mysql-5.1-rpl-merge

into  dl145h.mysql.com:/data0/mkindahl/mysql-5.1-rpl


mysql-test/r/ctype_ucs.result:
  Auto merged
mysql-test/r/variables.result:
  Auto merged
mysql-test/t/ctype_ucs.test:
  Auto merged
mysql-test/t/variables.test:
  Auto merged
sql/slave.cc:
  Auto merged
parents a77151c7 9c817e7b
...@@ -342,5 +342,6 @@ SHOW CREATE TABLE t1; ...@@ -342,5 +342,6 @@ SHOW CREATE TABLE t1;
--echo --- Do Cleanup --- --echo --- Do Cleanup ---
DROP TABLE IF EXISTS t1; DROP TABLE IF EXISTS t1;
sync_slave_with_master;
# End of 5.1 test case # End of 5.1 test case
#
# 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;
...@@ -326,6 +326,41 @@ latin1_german2_ci 6109 ...@@ -326,6 +326,41 @@ latin1_german2_ci 6109
latin1_german2_ci 61 latin1_german2_ci 61
latin1_german2_ci 6120 latin1_german2_ci 6120
drop table t1; 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; SET NAMES latin1;
CREATE TABLE t1 ( CREATE TABLE t1 (
col1 varchar(255) NOT NULL default '' col1 varchar(255) NOT NULL default ''
......
...@@ -2647,6 +2647,41 @@ select c1 as c2h from t1 where c1 like 'ab#_def' escape '#'; ...@@ -2647,6 +2647,41 @@ select c1 as c2h from t1 where c1 like 'ab#_def' escape '#';
c2h c2h
ab_def ab_def
drop table t1; 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); 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 (1, _ucs2 0x01310069), (2, _ucs2 0x01310131);
INSERT INTO t1 VALUES (3, _ucs2 0x00690069), (4, _ucs2 0x01300049); INSERT INTO t1 VALUES (3, _ucs2 0x00690069), (4, _ucs2 0x01300049);
......
...@@ -613,6 +613,41 @@ select c1 as c2h from t1 where c1 like 'ab#_def' escape '#'; ...@@ -613,6 +613,41 @@ select c1 as c2h from t1 where c1 like 'ab#_def' escape '#';
c2h c2h
ab_def ab_def
drop table t1; 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 NAMES latin1;
SET collation_connection='ucs2_bin'; SET collation_connection='ucs2_bin';
create table t1 select repeat('a',4000) a; create table t1 select repeat('a',4000) a;
......
...@@ -939,6 +939,41 @@ select c1 as c2h from t1 where c1 like 'ab#_def' escape '#'; ...@@ -939,6 +939,41 @@ select c1 as c2h from t1 where c1 like 'ab#_def' escape '#';
c2h c2h
ab_def ab_def
drop table t1; 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'; SET collation_connection='utf8_bin';
create table t1 select repeat('a',4000) a; create table t1 select repeat('a',4000) a;
delete from t1; delete from t1;
......
...@@ -627,7 +627,7 @@ a b ...@@ -627,7 +627,7 @@ a b
4 4 4 4
show master status /* there must be the UPDATE query event */; show master status /* there must be the UPDATE query event */;
File Position Binlog_Do_DB Binlog_Ignore_DB File Position Binlog_Do_DB Binlog_Ignore_DB
master-bin.000001 336 master-bin.000001 197
delete from t1; delete from t1;
delete from t2; delete from t2;
insert into t1 values (1,2),(3,4),(4,4); 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; ...@@ -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' ERROR 23000: Duplicate entry '4' for key 'PRIMARY'
show master status /* there must be the UPDATE query event */; show master status /* there must be the UPDATE query event */;
File Position Binlog_Do_DB Binlog_Ignore_DB File Position Binlog_Do_DB Binlog_Ignore_DB
master-bin.000001 351 master-bin.000001 212
drop table t1, t2; drop table t1, t2;
set @@session.binlog_format= @sav_binlog_format; set @@session.binlog_format= @sav_binlog_format;
drop table if exists t1, t2, t3; drop table if exists t1, t2, t3;
......
...@@ -3870,181 +3870,6 @@ UNLOCK TABLES; ...@@ -3870,181 +3870,6 @@ UNLOCK TABLES;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
DROP TABLE t1; 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 # BUG# 16853: mysqldump doesn't show events
# #
......
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 #
Master_SSL_Verify_Server_Cert No
Last_IO_Errno 0
Last_IO_Error
Last_SQL_Errno 0
Last_SQL_Error
stop slave; ---- Init ----
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 @my_slave_net_timeout =@@global.slave_net_timeout;
---- Test ----
set global slave_net_timeout=100; set global slave_net_timeout=100;
set global sql_slave_skip_counter=100; set global sql_slave_skip_counter=100;
show variables like 'slave_compressed_protocol'; show variables like 'slave_compressed_protocol';
...@@ -16,4 +12,6 @@ slave_load_tmpdir SLAVE_LOAD_TMPDIR ...@@ -16,4 +12,6 @@ slave_load_tmpdir SLAVE_LOAD_TMPDIR
show variables like 'slave_skip_errors'; show variables like 'slave_skip_errors';
Variable_name Value Variable_name Value
slave_skip_errors 3,100,137,643,1752 slave_skip_errors 3,100,137,643,1752
---- Clean Up ----
set global slave_net_timeout=default; set global slave_net_timeout=default;
set global sql_slave_skip_counter= 0;
...@@ -13,3 +13,4 @@ a b ...@@ -13,3 +13,4 @@ a b
SELECT * FROM t1 ORDER BY a; SELECT * FROM t1 ORDER BY a;
a b a b
3 -3 3 -3
DROP TABLE t1;
...@@ -18,9 +18,7 @@ master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES (1,1), (1,2), (2 ...@@ -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`; 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`; 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`; 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`; 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`; 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`; 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 master-bin.000001 # Query # # use `test`; UPDATE t1, t3 SET m = 2, e = 3 WHERE n = f
......
--slave-skip-errors=3,100,137,643,1752
...@@ -116,6 +116,7 @@ SELECT FIELD('ue',s1), FIELD(' ...@@ -116,6 +116,7 @@ SELECT FIELD('ue',s1), FIELD('
DROP TABLE t1; DROP TABLE t1;
-- source include/ctype_filesort.inc -- source include/ctype_filesort.inc
-- source include/ctype_german.inc
# #
# Bug#7878 with utf8_general_ci, equals (=) has problem with # Bug#7878 with utf8_general_ci, equals (=) has problem with
......
...@@ -458,6 +458,7 @@ drop table t1; ...@@ -458,6 +458,7 @@ drop table t1;
SET collation_connection='utf8_unicode_ci'; SET collation_connection='utf8_unicode_ci';
-- source include/ctype_filesort.inc -- source include/ctype_filesort.inc
-- source include/ctype_like_escape.inc -- source include/ctype_like_escape.inc
-- source include/ctype_german.inc
# End of 4.1 tests # End of 4.1 tests
......
...@@ -373,6 +373,7 @@ drop table t1; ...@@ -373,6 +373,7 @@ drop table t1;
SET collation_connection='ucs2_general_ci'; SET collation_connection='ucs2_general_ci';
-- source include/ctype_filesort.inc -- source include/ctype_filesort.inc
-- source include/ctype_like_escape.inc -- source include/ctype_like_escape.inc
-- source include/ctype_german.inc
SET NAMES latin1; SET NAMES latin1;
SET collation_connection='ucs2_bin'; SET collation_connection='ucs2_bin';
-- source include/ctype_filesort.inc -- source include/ctype_filesort.inc
......
...@@ -721,6 +721,7 @@ select hex(soundex(_utf8 0xD091D092D093)); ...@@ -721,6 +721,7 @@ select hex(soundex(_utf8 0xD091D092D093));
SET collation_connection='utf8_general_ci'; SET collation_connection='utf8_general_ci';
-- source include/ctype_filesort.inc -- source include/ctype_filesort.inc
-- source include/ctype_like_escape.inc -- source include/ctype_like_escape.inc
-- source include/ctype_german.inc
SET collation_connection='utf8_bin'; SET collation_connection='utf8_bin';
-- source include/ctype_filesort.inc -- source include/ctype_filesort.inc
-- source include/ctype_like_escape.inc -- source include/ctype_like_escape.inc
......
...@@ -1613,6 +1613,10 @@ DROP TABLE t1; ...@@ -1613,6 +1613,10 @@ DROP TABLE t1;
# #
# Added for use-thread option # 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 t1 (a text , b text);
create table t2 (a text , b text); create table t2 (a text , b text);
insert t1 values ("Duck, Duck", "goose"); insert t1 values ("Duck, Duck", "goose");
...@@ -1650,6 +1654,8 @@ drop table t2; ...@@ -1650,6 +1654,8 @@ drop table t2;
drop table words2; drop table words2;
}
--echo # --echo #
--echo # BUG# 16853: mysqldump doesn't show events --echo # BUG# 16853: mysqldump doesn't show events
--echo # --echo #
......
--loose-debug=d,simulate_io_slave_error_on_init,simulate_sql_slave_error_on_init
# 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
--loose-slave-skip-errors=3,100,137,643,1752
source include/master-slave.inc; # Tests that variables work correctly (setting and showing). This
# test is like the main.variables test, but for variables not
# available in embedded mode.
# Init for rstore of variable values 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; set @my_slave_net_timeout =@@global.slave_net_timeout;
--echo ---- Test ----
set global slave_net_timeout=100; set global slave_net_timeout=100;
set global sql_slave_skip_counter=100; set global sql_slave_skip_counter=100;
...@@ -16,5 +22,9 @@ show variables like 'slave_load_tmpdir'; ...@@ -16,5 +22,9 @@ show variables like 'slave_load_tmpdir';
# that a list of values works correctly # that a list of values works correctly
show variables like 'slave_skip_errors'; show variables like 'slave_skip_errors';
# Cleanup --echo ---- Clean Up ----
set global slave_net_timeout=default; 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;
...@@ -3843,29 +3843,25 @@ bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat) ...@@ -3843,29 +3843,25 @@ bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat)
- table is not mysql.event - table is not mysql.event
*/ */
/* The Sun compiler cannot instantiate the template below if this is static bool check_table_binlog_row_based(THD *thd, TABLE *table)
declared static, but it works by putting it into an anonymous {
namespace. */ if (table->s->cached_row_logging_check == -1)
namespace {
bool check_table_binlog_row_based(THD *thd, TABLE *table)
{ {
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));
int const check(table->s->tmp_table == NO_TMP_TABLE && table->s->cached_row_logging_check= check;
binlog_filter->db_ok(table->s->db.str)); }
table->s->cached_row_logging_check= check;
}
DBUG_ASSERT(table->s->cached_row_logging_check == 0 || DBUG_ASSERT(table->s->cached_row_logging_check == 0 ||
table->s->cached_row_logging_check == 1); table->s->cached_row_logging_check == 1);
return (thd->current_stmt_binlog_row_based && return (thd->current_stmt_binlog_row_based &&
table->s->cached_row_logging_check && table->s->cached_row_logging_check &&
(thd->options & OPTION_BIN_LOG) && (thd->options & OPTION_BIN_LOG) &&
mysql_bin_log.is_open()); mysql_bin_log.is_open());
}
} }
/** @brief /** @brief
Write table maps for all (manually or automatically) locked tables Write table maps for all (manually or automatically) locked tables
to the binary log. to the binary log.
...@@ -3879,7 +3875,7 @@ namespace { ...@@ -3879,7 +3875,7 @@ namespace {
that are locked by the thread 'thd'. Either manually locked that are locked by the thread 'thd'. Either manually locked
(stored in THD::locked_tables) and automatically locked (stored (stored in THD::locked_tables) and automatically locked (stored
in THD::lock) are considered. in THD::lock) are considered.
RETURN VALUE RETURN VALUE
0 All OK 0 All OK
1 Failed to write all table maps 1 Failed to write all table maps
...@@ -3888,115 +3884,97 @@ namespace { ...@@ -3888,115 +3884,97 @@ namespace {
THD::lock THD::lock
THD::locked_tables THD::locked_tables
*/ */
namespace
static int write_locked_table_maps(THD *thd)
{ {
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 "
DBUG_ENTER("write_locked_table_maps"); "thd->extra_lock: 0x%lx",
DBUG_PRINT("enter", ("thd: 0x%lx thd->lock: 0x%lx thd->locked_tables: 0x%lx " (long) thd, (long) thd->lock,
"thd->extra_lock: 0x%lx", (long) thd->locked_tables, (long) thd->extra_lock));
(long) thd, (long) thd->lock,
(long) thd->locked_tables, (long) thd->extra_lock));
if (thd->get_binlog_table_maps() == 0) 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]; MYSQL_LOCK const *const lock= locks[i];
locks[0]= thd->extra_lock; if (lock == NULL)
locks[1]= thd->lock; continue;
locks[2]= thd->locked_tables;
for (uint i= 0 ; i < sizeof(locks)/sizeof(*locks) ; ++i ) TABLE **const end_ptr= lock->table + lock->table_count;
for (TABLE **table_ptr= lock->table ;
table_ptr != end_ptr ;
++table_ptr)
{ {
MYSQL_LOCK const *const lock= locks[i]; TABLE *const table= *table_ptr;
if (lock == NULL) DBUG_PRINT("info", ("Checking table %s", table->s->table_name.str));
continue; if (table->current_lock == F_WRLCK &&
check_table_binlog_row_based(thd, table))
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; int const has_trans= table->file->has_transactions();
DBUG_PRINT("info", ("Checking table %s", table->s->table_name.str)); int const error= thd->binlog_write_table_map(table, has_trans);
if (table->current_lock == F_WRLCK && /*
check_table_binlog_row_based(thd, table)) If an error occurs, it is the responsibility of the caller to
{ roll back the transaction.
int const has_trans= table->file->has_transactions(); */
int const error= thd->binlog_write_table_map(table, has_trans); if (unlikely(error))
/* DBUG_RETURN(1);
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);
}
template<class RowsEventT> int
binlog_log_row(TABLE* table, typedef bool Log_func(THD*, TABLE*, bool, MY_BITMAP*,
const uchar *before_record, uint, const uchar*, const uchar*);
const uchar *after_record)
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) MY_BITMAP cols;
return 0; /* Potential buffer on the stack for the bitmap */
bool error= 0; uint32 bitbuf[BITMAP_STACKBUF_SIZE/sizeof(uint32)];
THD *const thd= table->in_use; 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; bitmap_set_all(&cols);
/* Potential buffer on the stack for the bitmap */ if (likely(!(error= write_locked_table_maps(thd))))
uint32 bitbuf[BITMAP_STACKBUF_SIZE/sizeof(uint32)]; error= (*log_func)(thd, table, table->file->has_transactions(),
uint n_fields= table->s->fields; &cols, table->s->fields,
my_bool use_bitbuf= n_fields <= sizeof(bitbuf)*8; before_record, after_record);
/* if (!use_bitbuf)
If there are no table maps written to the binary log, this is bitmap_free(&cols);
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=
RowsEventT::binlog_row_logging_function(thd, table,
table->file->
has_transactions(),
&cols, table->s->fields,
before_record,
after_record);
}
if (!use_bitbuf)
bitmap_free(&cols);
}
} }
return error ? HA_ERR_RBR_LOGGING_FAILED : 0;
} }
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<Write_rows_log_event>(TABLE *, const uchar *, const uchar *);
template int
binlog_log_row<Delete_rows_log_event>(TABLE *, const uchar *, const uchar *);
template int
binlog_log_row<Update_rows_log_event>(TABLE *, const uchar *, const uchar *);
} }
int handler::ha_external_lock(THD *thd, int lock_type) int handler::ha_external_lock(THD *thd, int lock_type)
{ {
DBUG_ENTER("handler::ha_external_lock"); DBUG_ENTER("handler::ha_external_lock");
...@@ -4041,10 +4019,11 @@ int handler::ha_reset() ...@@ -4041,10 +4019,11 @@ int handler::ha_reset()
int handler::ha_write_row(uchar *buf) int handler::ha_write_row(uchar *buf)
{ {
int error; int error;
Log_func *log_func= Write_rows_log_event::binlog_row_logging_function;
DBUG_ENTER("handler::ha_write_row"); DBUG_ENTER("handler::ha_write_row");
if (unlikely(error= write_row(buf))) if (unlikely(error= write_row(buf)))
DBUG_RETURN(error); DBUG_RETURN(error);
if (unlikely(error= binlog_log_row<Write_rows_log_event>(table, 0, buf))) if (unlikely(error= binlog_log_row(table, 0, buf, log_func)))
DBUG_RETURN(error); /* purecov: inspected */ DBUG_RETURN(error); /* purecov: inspected */
DBUG_RETURN(0); DBUG_RETURN(0);
} }
...@@ -4053,6 +4032,7 @@ int handler::ha_write_row(uchar *buf) ...@@ -4053,6 +4032,7 @@ int handler::ha_write_row(uchar *buf)
int handler::ha_update_row(const uchar *old_data, uchar *new_data) int handler::ha_update_row(const uchar *old_data, uchar *new_data)
{ {
int error; 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] Some storage engines require that the new record is in record[0]
...@@ -4062,7 +4042,7 @@ int handler::ha_update_row(const uchar *old_data, uchar *new_data) ...@@ -4062,7 +4042,7 @@ int handler::ha_update_row(const uchar *old_data, uchar *new_data)
if (unlikely(error= update_row(old_data, new_data))) if (unlikely(error= update_row(old_data, new_data)))
return error; return error;
if (unlikely(error= binlog_log_row<Update_rows_log_event>(table, old_data, new_data))) if (unlikely(error= binlog_log_row(table, old_data, new_data, log_func)))
return error; return error;
return 0; return 0;
} }
...@@ -4070,9 +4050,10 @@ int handler::ha_update_row(const uchar *old_data, uchar *new_data) ...@@ -4070,9 +4050,10 @@ int handler::ha_update_row(const uchar *old_data, uchar *new_data)
int handler::ha_delete_row(const uchar *buf) int handler::ha_delete_row(const uchar *buf)
{ {
int error; int error;
Log_func *log_func= Delete_rows_log_event::binlog_row_logging_function;
if (unlikely(error= delete_row(buf))) if (unlikely(error= delete_row(buf)))
return error; return error;
if (unlikely(error= binlog_log_row<Delete_rows_log_event>(table, buf, 0))) if (unlikely(error= binlog_log_row(table, buf, 0, log_func)))
return error; return error;
return 0; return 0;
} }
......
...@@ -1507,6 +1507,9 @@ void set_slave_thread_default_charset(THD* thd, Relay_log_info const *rli) ...@@ -1507,6 +1507,9 @@ void set_slave_thread_default_charset(THD* thd, Relay_log_info const *rli)
static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type) static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type)
{ {
DBUG_ENTER("init_slave_thread"); DBUG_ENTER("init_slave_thread");
#if !defined(DBUG_OFF)
int simulate_error= 0;
#endif
thd->system_thread = (thd_type == SLAVE_THD_SQL) ? thd->system_thread = (thd_type == SLAVE_THD_SQL) ?
SYSTEM_THREAD_SLAVE_SQL : SYSTEM_THREAD_SLAVE_IO; SYSTEM_THREAD_SLAVE_SQL : SYSTEM_THREAD_SLAVE_IO;
thd->security_ctx->skip_grants(); thd->security_ctx->skip_grants();
...@@ -1526,10 +1529,17 @@ static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type) ...@@ -1526,10 +1529,17 @@ static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type)
thd->thread_id= thd->variables.pseudo_thread_id= thread_id++; thd->thread_id= thd->variables.pseudo_thread_id= thread_id++;
pthread_mutex_unlock(&LOCK_thread_count); 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()) if (init_thr_lock() || thd->store_globals())
#endif
{ {
thd->cleanup(); thd->cleanup();
delete thd;
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
lex_start(thd); lex_start(thd);
...@@ -2229,6 +2239,7 @@ pthread_handler_t handle_slave_io(void *arg) ...@@ -2229,6 +2239,7 @@ pthread_handler_t handle_slave_io(void *arg)
thd= new THD; // note that contructor of THD uses DBUG_ ! thd= new THD; // note that contructor of THD uses DBUG_ !
THD_CHECK_SENTRY(thd); THD_CHECK_SENTRY(thd);
mi->io_thd = thd;
pthread_detach_this_thread(); pthread_detach_this_thread();
thd->thread_stack= (char*) &thd; // remember where our stack is thd->thread_stack= (char*) &thd; // remember where our stack is
...@@ -2239,7 +2250,6 @@ pthread_handler_t handle_slave_io(void *arg) ...@@ -2239,7 +2250,6 @@ pthread_handler_t handle_slave_io(void *arg)
sql_print_error("Failed during slave I/O thread initialization"); sql_print_error("Failed during slave I/O thread initialization");
goto err; goto err;
} }
mi->io_thd = thd;
pthread_mutex_lock(&LOCK_thread_count); pthread_mutex_lock(&LOCK_thread_count);
threads.append(thd); threads.append(thd);
pthread_mutex_unlock(&LOCK_thread_count); pthread_mutex_unlock(&LOCK_thread_count);
...@@ -2530,9 +2540,11 @@ pthread_handler_t handle_slave_sql(void *arg) ...@@ -2530,9 +2540,11 @@ pthread_handler_t handle_slave_sql(void *arg)
thd = new THD; // note that contructor of THD uses DBUG_ ! thd = new THD; // note that contructor of THD uses DBUG_ !
thd->thread_stack = (char*)&thd; // remember where our stack is thd->thread_stack = (char*)&thd; // remember where our stack is
rli->sql_thd= thd;
/* Inform waiting threads that slave has started */ /* Inform waiting threads that slave has started */
rli->slave_run_id++; rli->slave_run_id++;
rli->slave_running = 1;
pthread_detach_this_thread(); pthread_detach_this_thread();
if (init_slave_thread(thd, SLAVE_THD_SQL)) if (init_slave_thread(thd, SLAVE_THD_SQL))
...@@ -2547,7 +2559,6 @@ pthread_handler_t handle_slave_sql(void *arg) ...@@ -2547,7 +2559,6 @@ pthread_handler_t handle_slave_sql(void *arg)
goto err; goto err;
} }
thd->init_for_queries(); thd->init_for_queries();
rli->sql_thd= thd;
thd->temporary_tables = rli->save_temporary_tables; // restore temp tables thd->temporary_tables = rli->save_temporary_tables; // restore temp tables
pthread_mutex_lock(&LOCK_thread_count); pthread_mutex_lock(&LOCK_thread_count);
threads.append(thd); threads.append(thd);
...@@ -2560,7 +2571,6 @@ pthread_handler_t handle_slave_sql(void *arg) ...@@ -2560,7 +2571,6 @@ pthread_handler_t handle_slave_sql(void *arg)
start receiving data so we realize we are not caught up and start receiving data so we realize we are not caught up and
Seconds_Behind_Master grows. No big deal. Seconds_Behind_Master grows. No big deal.
*/ */
rli->slave_running = 1;
rli->abort_slave = 0; rli->abort_slave = 0;
pthread_mutex_unlock(&rli->run_lock); pthread_mutex_unlock(&rli->run_lock);
pthread_cond_broadcast(&rli->start_cond); pthread_cond_broadcast(&rli->start_cond);
......
...@@ -780,8 +780,6 @@ void multi_delete::abort() ...@@ -780,8 +780,6 @@ void multi_delete::abort()
} }
thd->transaction.all.modified_non_trans_table= true; thd->transaction.all.modified_non_trans_table= true;
} }
DBUG_ASSERT(!normal_tables || !deleted ||
thd->transaction.stmt.modified_non_trans_table);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
...@@ -899,8 +897,6 @@ bool multi_delete::send_eof() ...@@ -899,8 +897,6 @@ bool multi_delete::send_eof()
{ {
query_cache_invalidate3(thd, delete_tables, 1); 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 ((local_error == 0) || thd->transaction.stmt.modified_non_trans_table)
{ {
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
......
...@@ -1203,7 +1203,7 @@ multi_update::multi_update(TABLE_LIST *table_list, ...@@ -1203,7 +1203,7 @@ multi_update::multi_update(TABLE_LIST *table_list,
tmp_tables(0), updated(0), found(0), fields(field_list), tmp_tables(0), updated(0), found(0), fields(field_list),
values(value_list), table_count(0), copy_field(0), values(value_list), table_count(0), copy_field(0),
handle_duplicates(handle_duplicates_arg), do_update(1), trans_safe(1), 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)
{} {}
...@@ -1718,7 +1718,7 @@ void multi_update::abort() ...@@ -1718,7 +1718,7 @@ void multi_update::abort()
if (trans_safe) if (trans_safe)
{ {
DBUG_ASSERT(transactional_tables); DBUG_ASSERT(!updated || transactional_tables);
(void) ha_autocommit_or_rollback(thd, 1); (void) ha_autocommit_or_rollback(thd, 1);
} }
else else
......
...@@ -155,7 +155,7 @@ static MY_UNICASE_INFO plane00[]={ ...@@ -155,7 +155,7 @@ static MY_UNICASE_INFO plane00[]={
{0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055}, {0x00D8,0x00F8,0x00D8}, {0x00D9,0x00F9,0x0055},
{0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055}, {0x00DA,0x00FA,0x0055}, {0x00DB,0x00FB,0x0055},
{0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059}, {0x00DC,0x00FC,0x0055}, {0x00DD,0x00FD,0x0059},
{0x00DE,0x00FE,0x00DE}, {0x00DF,0x00DF,0x00DF}, {0x00DE,0x00FE,0x00DE}, {0x00DF,0x00DF,0x0053},
{0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041}, {0x00C0,0x00E0,0x0041}, {0x00C1,0x00E1,0x0041},
{0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041}, {0x00C2,0x00E2,0x0041}, {0x00C3,0x00E3,0x0041},
{0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041}, {0x00C4,0x00E4,0x0041}, {0x00C5,0x00E5,0x0041},
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment